第一个问题是音频重新缩放。我尝试重做doc/examples/transcode_aac.c
以便它也从41100重新采样到48000,它包含一个警告,它无法执行此操作。
使用doc/examples/resampling_audio.c
作为参考,我在做swr_convert
之前看到,我需要在输出中找到音频样本的数量,代码如下:
int dst_nb_samples = av_rescale_rnd( input_frame->nb_samples + swr_get_delay(resampler_context, 41100),
48000, 41100, AV_ROUND_UP);
问题是,当我设置int dst_nb_samples = input_frame->nb_samples
(1024)时,它会正常编码和播放,但当我执行av_rescale_rnd
事物(导致1196)时,音频会变慢并且扭曲,就像音频中有跳过一样。
第二个问题是尝试使用webm
音频来复用opus
。
当我将AVStream->time_base
设置为1/48000
并将AVFrame->pts
增加960时,结果文件将在播放器中播放为更大的文件。 17秒音频显示为16m11s音频,但它正常播放。
当我将pts
增加20时,它会正常显示,但在编码期间会有很多[libopus @ 00ffa660] Queue input is backward in time
条消息。 pts
30也是如此,仍有这些消息。
我应该尝试time_scale
1/1000吗? webm
始终包含以毫秒为单位的时间码,opus
的数据包大小为20毫秒(960个样本,48000赫兹)。
搜索pts += 20;
以下是整个文件,我所做的所有修改都标有//MINE
:http://www.mediafire.com/file/jlgo7x4hiz7bw64/transcode_aac.c
以下是我在http://www.mediafire.com/file/zdy0zarlqw3qn6s/480P_600K_71149981_soundonly.mkv
上测试的文件答案 0 :(得分:0)
dst_nb_samples
可以这样计算:
dst_nb_samples = 48000.0 / audio_stream->codec->sample_rate * inputAudioFrame->nb_samples;
你可能也是正确的,我没有检查,但是我之前使用的这个,与你的确认,但你提供的数字检查。所以真正的问题可能在其他地方。尝试与视频帧同步提供960个样本,为此,您需要将音频帧存储到额外的线性缓冲区。看看是否有问题需要解决。
和/或:
2根据我的经验,音频pts的数量会增加samples per frame
(即50fps视频的960为48000hz (48000/50)
),而不是ms。如果您提供1196个样本,请使用pts += 1196
(如果未使用上面提到的其他缓冲区)。这与视频帧pts不同。希望有所帮助。
你肯定是正确的道路。如果我有时间,我会检查源代码。无论如何希望有所帮助。
答案 1 :(得分:0)
最简单的方法是使用swr_convert_frame,它获取一帧并将其重新采样为完全不同的帧。 您可以在这里了解更多信息:https://ffmpeg.org/doxygen/3.2/swresample_8h_source.html