当前位置: 首页 > 知识库问答 >
问题:

利用AutoGen FFmpeg库实现MP4音频/视频同步

东方方伟
2023-03-14

我目前有问题,使我的音频和视频流保持同步

以下是我正在使用的AVCodecContexts:

视频:

AVCodec* videoCodec = ffmpeg.avcodec_find_encoder(AVCodecID.AV_CODEC_ID_H264)
AVCodecContext* videoCodecContext = ffmpeg.avcodec_alloc_context3(videoCodec);
videoCodecContext->bit_rate = 400000;
videoCodecContext->width = 1280;
videoCodecContext->height = 720;
videoCodecContext->gop_size = 12;
videoCodecContext->max_b_frames = 1;
videoCodecContext->pix_fmt = videoCodec->pix_fmts[0];
videoCodecContext->codec_id = videoCodec->id;
videoCodecContext->codec_type = videoCodec->type;
videoCodecContext->time_base = new AVRational
{
    num = 1,
    den = 30
};
AVCodec* audioCodec = ffmpeg.avcodec_find_encoder(AVCodecID.AV_CODEC_ID_AAC)
AVCodecContext* audioCodecContext = ffmpeg.avcodec_alloc_context3(audioCodec);
audioCodecContext->bit_rate = 1280000;
audioCodecContext->sample_rate = 48000;
audioCodecContext->channels = 2;
audioCodecContext->channel_layout = ffmpeg.AV_CH_LAYOUT_STEREO;
audioCodecContext->frame_size = 1024;
audioCodecContext->sample_fmt = audioCodec->sample_fmts[0];
audioCodecContext->profile = ffmpeg.FF_PROFILE_AAC_LOW;
audioCodecContext->codec_id = audioCodec->id;
audioCodecContext->codec_type = audioCodec->type;
outputFrame->pts = frameIndex;  // The current index of the image frame being written
ffmpeg.av_packet_rescale_ts(&packet, videoCodecContext->time_base, videoStream->time_base);

这演奏得很完美。

然而,当我对音频做同样的操作时,视频以慢动作播放,首先播放音频,然后在没有声音的情况下继续播放视频。

我找不到任何地方的例子如何设置PTS/DTS位置的视频/音频在MP4文件。任何帮助的例子都将是伟大的!

而且,我首先写视频帧,然后(一旦它们都写好了)我写音频。我已经用注释中建议的调整值更新了这个问题。

我已经上传了一个测试视频来显示我的结果:http://www.filedropper.com/test_124

共有1个答案

东方英豪
2023-03-14

PS:查看这篇文章/教程与FFMPEG的A/V同步。它可能会帮助你,如果下面没有。

1)关于视频和音频时间戳...

而不是使用当前frameindex作为时间戳,然后再重新缩放它们。如果可能,只需跳过取消。

2)关于音频设置...

比特率:
AudioCodecContext->bit_rate=64000;如果sample_rate是48000Hz(我假设您的比特深度是每个样本16比特?),那么似乎很奇怪。

尝试96000128000作为最低起始值。

int avcodeccontext::frame_size表示“音频帧中每个通道的样本数”。

考虑到上面引用的文档,并且MPEG AAC不做“每通道”(因为两个L/R通道的数据都包含在每帧中)。每个AAC帧保存1024个PCM样本。

AudioCodecContext->frame_size=88200;对于大小,可以尝试=1024;

配置文件:
我注意到AAC配置文件使用了main。我习惯在视频中看到低复杂度。我尝试了几个随机的MP4文件从各种来源在我的硬盘上,我找不到一个使用“main”配置文件。作为最后的手段,测试“低复杂性”不会有什么坏处。

尝试使用AudioCodecContext->profile=ffmpeg.ff_profile_aac_low;

PS:检查这个可能的AAC问题(取决于您的FFmpeg版本)。

 类似资料:
  • 我正在尝试将MP3音频文件混合到MP4视频中。经过数小时的搜索,我得出结论,我需要将MP3文件转换为AAC格式,该格式适合MP4容器。 在android中为视频添加音频 但是我找不到任何关于如何将MP3文件转换为AAC格式的留档。那么你对如何将MP3音频转换为AAC音频有什么建议吗? 此外,我还需要在最终视频中的特定时间插入几段音频。

  • 本文向大家介绍Javacv使用ffmpeg实现音视频同步播放,包括了Javacv使用ffmpeg实现音视频同步播放的使用技巧和注意事项,需要的朋友参考一下 最近用javaCV的ffmpeg包的FFmpegFrameGrabber帧捕捉器对捕捉到的音频帧和视频帧做了同步的播放。采用的同步方法是视频向音频同步。 程序和源码 具体的思路如下: (1)首先介绍ffmpeg是如何捕捉视频文件的图像和声音的

  • 使用ffmpeg concat连接多个文件似乎会导致音频的时间戳或偏移不匹配。我试过几个视频,发现H.264/MP4也有同样的问题。 使用并对视频进行编码似乎可以很好地工作。当ffmpeg执行全部转换计算时,音频保持同步,似乎可以得到所有正确的结果。 然而,简单地将视频级联而不进行任何转换或编码会导致同步问题缓慢增加。显然,对视频进行编码而不是简单地加入它们将导致信息/质量的损失,所以我宁愿找到一

  • 主要内容:HTML 音频/视频 DOM 参考手册,HTML 音频/视频 方法,HTML 音频/视频属性,HTML 音频/视频事件HTML 音频/视频 DOM 参考手册 HTML5 DOM 为 <audio> 和 <video> 元素提供了方法、属性和事件。 这些方法、属性和事件允许您使用 JavaScript 来操作 <audio> 和 <video> 元素。 HTML 音频/视频 方法 方法 描述 addTextTrack() 向音频/视频添加新的文本轨道。 canPlayType() 检测浏

  • null 这是我正在使用的代码,任何提示都将不胜感激! 将每个视频转换为临时文件