放飞自己2016 2015-10-29 07:40 采纳率: 0%
浏览 4724

利用MP4v2录制MP4文件视频播放快问题

 录制场景是这样的,对一个视频会议进行录像,音频是混音后的pcmu格式的语音,视频在同一时刻,只录制某一个成员的视频,因此MP4视频构成就是 A成员视频+B成员视频+c成员视频
现在使用mp4v2进行录像,录制出来后的问题是:视频播放比音频快
这个问题怎么解决呢,视频代码如下:
  uint32_t datalen = *len - 12;
    int iframe = 0;
    uint32_t size;
    uint8_t *hdr = NULL;
    uint8_t fragment_type;
    uint8_t nal_type;
    uint8_t start_bit;
    switch_rtp_hdr_t *rtp_hdr = data;
    mp4_file_context_t *context = handle->private_info;
    uint8_t payload_number = 0;


    switch_mutex_lock(context->mutex);
    if (!context->video) {
        context->video = MP4AddH264VideoTrack(context->fd, 90000, 90000/FPS, 352, 288, H264_PROFILE_BASELINE, 0xe0, 0x1f, 3);
        if (context->video == MP4_INVALID_TRACK_ID) {
            switch_mutex_unlock(context->mutex);
            return SWITCH_STATUS_FALSE;
        }

        MP4SetVideoProfileLevel(context->fd, 0x7F);

        context->video_hint = MP4AddHintTrack(context->fd, context->video);

        if (context->video_hint == MP4_INVALID_TRACK_ID) {
            switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "invalid hint track!\n");
            switch_mutex_unlock(context->mutex);
            return SWITCH_STATUS_FALSE;
        }

        MP4SetHintTrackRtpPayload(
            context->fd,
            context->video_hint,
            "H264",
            &payload_number,
            20480, // magic number, maximum payload size, can be 0? FIXME
            NULL,
            false,
            false);

        context->video_sample_id = 1;
    }

    switch_mutex_unlock(context->mutex);

    hdr = ((uint8_t *)data + 12);
    fragment_type = hdr[0] & 0x1f;
    nal_type = hdr[1] & 0x1f;
    start_bit = hdr[1] & 0x80;
    iframe = (((fragment_type == 28 || fragment_type == 29) && nal_type == 5 && start_bit == 128) || fragment_type == 5 || fragment_type ==7 || fragment_type ==8) ? 1 : 0;

    tp_hdr->m, start_bit, iframe);

    if (switch_buffer_inuse(context->buf) == 0) {
        MP4AddRtpVideoHint(context->fd, context->video_hint, iframe, (uint8_t)MP4_INVALID_DURATION);
    }

    MP4AddRtpPacket(context->fd, context->video_hint, rtp_hdr->m, (uint8_t)MP4_INVALID_DURATION);
    MP4AddRtpSampleData(context->fd, context->video_hint, context->video_sample_id++, switch_buffer_inuse(context->buf), datalen + 4);

    size = htonl(datalen);
    switch_buffer_write(context->buf, &size, 4);
    switch_buffer_write(context->buf, hdr, datalen);

    switch_mutex_lock(context->mutex);

    if (fragment_type == 7 && !context->sps_set) { //sps
        MP4AddH264SequenceParameterSet(context->fd, context->video, hdr, datalen);
        context->sps_set = 1;
    } else if (fragment_type == 8 && !context->pps_set) { //pps
        MP4AddH264PictureParameterSet(context->fd, context->video, hdr, datalen);
        context->pps_set = 1;
    }

    if (nal_type == 7 || nal_type == 8 || rtp_hdr->m == 0) {
    } else {
        uint32_t used = switch_buffer_inuse(context->buf);
        const void *data;
        switch_buffer_peek_zerocopy(context->buf, &data);
        MP4WriteRtpHint(context->fd, context->video_hint, MP4_INVALID_DURATION, iframe);
        MP4WriteSample(context->fd, context->video, data, used, DURATION, 0, iframe);
        switch_buffer_zero(context->buf);
    }

    switch_mutex_unlock(context->mutex);

    *len = datalen; // FIXME
  • 写回答

0条回答

    报告相同问题?

    悬赏问题

    • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
    • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
    • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
    • ¥50 成都蓉城足球俱乐部小程序抢票
    • ¥15 yolov7训练自己的数据集
    • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
    • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
    • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)
    • ¥20 matlab yalmip kkt 双层优化问题
    • ¥15 如何在3D高斯飞溅的渲染的场景中获得一个可控的旋转物体