问题
ffmpeg使用过程中截取总时长3:42 m4a文件的前42秒,使用播放器播放显示总时长仍然是3:42秒但是拖动进度条超过42秒后音频直接播放结束。问题音频文件因为版权问题暂不放出。
ffmpeg版本:
使用的是github预编译好的windows版本
ffmpeg version
git-2020-02-06-343ccfc Copyright (c) 2000-2020
the FFmpeg developers built with gcc 9.2.1 (GCC) 20200122
configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libdav1d --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libmfx --enable-ffnvcodec --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth --enable-libopenmpt --enable-amf
libavutil 56. 39.100 / 56. 39.100
libavcodec 58. 68.100 / 58. 68.100
libavformat 58. 38.100 / 58. 38.100
libavdevice 58. 9.103 / 58. 9.103
libavfilter 7. 74.100 / 7. 74.100
libswscale 5. 6.100 / 5. 6.100
libswresample 3. 6.100 / 3. 6.100
libpostproc 55. 6.100 / 55. 6.100
截取命令:
ffmpeg.exe -t 00:00:42 -i ./input.m4a -acodec copy out.m4a
解决
交换-i和-t参数顺序,问题解决。交换后命令:
ffmpeg.exe -i ./inoput.m4a -t 00:00:42 -acodec copy out.m4a
验证
为了验证是否所有m4a文件都有问题,本次采用https://docs.espressif.com/projects/esp-adf/en/latest/design-guide/audio-samples.html上的ff-16b-2c-44100hz.m4a示例m4a文件尝试:
- 该文件在交换参数前后均未发生文中问题
查找原因
经过比对,源文件比特率为95kbps,问题命令行下比特率变为17kbps,正常情况下仍为95kbps,故考虑可能是截取前后比特率变更导致的问题。
转换后比特率估算:95kbps*42/(3*60+42)≈17.97kbps
可以看出应该是输出文件从42s后没有内容但是文件计算比特率时按照bit/time的方式计算的平均值,所以这个不是成因,而是现象
查看文档
官方文档:http://ffmpeg.org/ffmpeg.html
Do not mix input and output files – first specify all input files, then all output files. Also do not mix options which belong to different files. All options apply ONLY to the next input or output file and are reset between files.
不要混合输入文件和输出文件–首先指定所有输入文件,然后指定所有输出文件。 也不要混用属于不同文件的选项。 所有选项仅适用于下一个输入或输出文件,并且在文件之间重置。
ffmpeg [global_options] {[input_file_options] -i input_url} … {[output_file_options] output_url} …
- 从官方命令行使用可以看出,-t出现在-i前指定的是输入选项,该选项导致输入文件在42s后停止写入,但是输出文件并没有限制,所以输出文件仍为3:42,但后面均为空
结论:
- ffmpeg命令不熟悉,且未查看官方文档导致的问题
- 暂时不清楚为何示例文件未出现该问题