【发布时间】:2016-11-06 23:21:13
【问题描述】:
我目前在使音频和视频流保持同步时遇到问题。
这些是我正在使用的 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;
在写入视频帧时,我将 PTS 位置设置如下:
outputFrame->pts = frameIndex; // The current index of the image frame being written
然后我使用 avcodec_encode_video2() 对帧进行编码。在此之后,我调用以下命令来设置时间戳:
ffmpeg.av_packet_rescale_ts(&packet, videoCodecContext->time_base, videoStream->time_base);
这玩起来很完美。
但是,当我对音频执行相同操作时,视频以慢动作播放,先播放音频,然后继续播放视频,然后没有声音。
我在任何地方都找不到有关如何在 MP4 文件中为视频/音频设置 pts/dts 位置的示例。任何帮助的例子都会很棒!
另外,我先写视频帧,然后(一旦它们都写完)我写音频。我已经用 cmets 中建议的调整值更新了这个问题。
我已经上传了一个测试视频来在这里展示我的结果:http://www.filedropper.com/test_124
【问题讨论】:
-
标签错误,一定是c++
-
我正在使用 AutoGen 库,它使用 C# 中的 Invoke 来访问这些库!
-
我不使用 FFmpeg API,只使用编译后的 .exe 作为进程(std in/out)。不幸的是,我无法测试您的代码,但是...希望我的回答中的建议对您有所帮助。
标签: c# c++ ffmpeg synchronization mp4