我正在尝试从 QuickTime 中复制音频。
>"C:\Program Files\ffmpeg\bin\ffmpeg.exe" -y -i a.mov -vn -acodec pcm_s16le a.wav
这是我的输出。抱歉格式不对。
ffmpeg version N-66673-gf0d1b3a Copyright (c) 2000-2014 the FFmpeg developers
built on Oct 6 2014 22:10:42 with gcc 4.9.1 (GCC)
configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis
--enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-zlib
libavutil 54. 9.100 / 54. 9.100
libavcodec 56. 3.101 / 56. 3.101
libavformat 56. 7.104 / 56. 7.104
libavdevice 56. 1.100 / 56. 1.100
libavfilter 5. 1.102 / 5. 1.102
libswscale 3. 1.100 / 3. 1.100
libswresample 1. 1.100 / 1. 1.100
libpostproc 53. 1.100 / 53. 1.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'a.mov':
Metadata:
major_brand : qt
minor_version : 512
compatible_brands: qt
encoder : Lavf56.7.104
Duration: 00:00:02.44, start: 0.021333, bitrate: 761 kb/s
Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720,
628 kb/s, 24 fps, 24 tbr, 12288 tbn, 48 tbc (default)
Metadata:
handler_name : DataHandler
encoder : Lavc56.3.101 libx264
Stream #0:1(eng): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 129 kb/s (default)
Metadata:
handler_name : DataHandler
Output #0, wav, to 'a.wav':
Metadata:
major_brand : qt
minor_version : 512
compatible_brands: qt
ISFT : Lavf56.7.104
Stream #0:0(eng): Audio: pcm_s16le ([1][0][0][0] / 0x0001), 48000 Hz, stereo
, s16, 1536 kb/s (default)
Metadata:
handler_name : DataHandler
encoder : Lavc56.3.101 pcm_s16le
Stream mapping:
Stream #0:1 -> #0:0 (aac (native) -> pcm_s16le (native))
Press [q] to stop, [?] for help
size= 460kB time=00:00:02.45 bitrate=1536.3kbits/s
video:0kB audio:460kB subtitle:0kB other streams:0kB global headers:0kB muxing o
verhead: 0.016559%
生成了一个 wav 文件。但是,如果你将 wav 文件和原始 quicktime 放入 Pro Tools 中,你会看到 wav 文件与原始 quicktime 中的时间不匹配。wav 文件中的音频大约晚了一帧半。
我尝试手动设置比特率和频率。
"C:\Program Files\ffmpeg\bin\ffmpeg.exe" -y -i a.mov -b:a 87k -ar 48000 -acodec pcm_s16le -vn a.wav
"C:\Program Files\ffmpeg\bin\ffmpeg.exe" -y -i a.mov -ar 48000 -acodec pcm_s16le -vn a_did_not_set_bitrate.wav
这两个命令都没有什么区别。有人遇到过这个问题吗?有什么解决方法吗?
编辑:
刚刚注意到输出中有些奇怪。早些时候,持续时间设置为:
Duration: 00:00:02.44
wav生成后,时间记录为:
time=00:00:02.45
wav 文件中是否添加了额外的时间?
2016 年 4 月 26 日补充:
有趣的。
>"C:\Program Files\ffmpeg\bin\ffprobe.exe" -select_streams a -read_intervals %+#1 -show_entries packet=pts_time a.mov
ffprobe version N-66673-gf0d1b3a Copyright (c) 2007-2014 the FFmpeg developers
built on Oct 6 2014 22:10:42 with gcc 4.9.1 (GCC)
configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-av
isynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enab
le-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --
enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable-lib
modplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrw
b --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinge
r --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --en
able-libvidstab --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis
--enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-
libx265 --enable-libxavs --enable-libxvid --enable-zlib
libavutil 54. 9.100 / 54. 9.100
libavcodec 56. 3.101 / 56. 3.101
libavformat 56. 7.104 / 56. 7.104
libavdevice 56. 1.100 / 56. 1.100
libavfilter 5. 1.102 / 5. 1.102
libswscale 3. 1.100 / 3. 1.100
libswresample 1. 1.100 / 1. 1.100
libpostproc 53. 1.100 / 53. 1.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'a.mov':
Metadata:
major_brand : qt
minor_version : 512
compatible_brands: qt
encoder : Lavf56.7.104
Duration: 00:00:02.44, start: 0.021333, bitrate: 761 kb/s
Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720,
628 kb/s, 24 fps, 24 tbr, 12288 tbn, 48 tbc (default)
Metadata:
handler_name : DataHandler
encoder : Lavc56.3.101 libx264
Stream #0:1(eng): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 12
9 kb/s (default)
Metadata:
handler_name : DataHandler
[PACKET]
pts_time=-0.021333
[/PACKET]
尝试分解这个命令。
“C:\Program Files\ffmpeg\bin\ffprobe.exe”-select_streams a-read_intervals %+#1-show_entries packet=pts_time a.mov
据我所知,这意味着从音频流中读取一个数据包并显示 PTS 时间,我认为这指的是演示时间戳。
这是否意味着音频在视频之前开始?也许,它比视频早 0.021333 秒开始。
2016 年 4 月 27 日补充:
运行相同的命令,v
结果-select_streams
如下:
[PACKET]
pts_time=0.000000
[/PACKET]
答案1
问题在于,你的 QuickTime 文件包含一个修剪,除非你明确地对它进行修剪,否则 FFMPEG 会忽略它输入通过 -ss 选项文件。
您可以通过以下行中的“start: 0.021333”看到 QuickTime 文件实际上从文件的第 0.021333 毫秒开始:
Duration: 00:00:02.44, start: 0.021333, bitrate: 761 kb/s
为了修复此问题,请尝试以下命令:
"C:\Program Files\ffmpeg\bin\ffmpeg.exe" -y -ss 0.021333 -i a.mov -vn -acodec pcm_s16le a.wav
请注意 -ss 选项必须位于输入文件(-i)之前,以确保其正常工作。
在我的程序中,我调用 FFProbe,获取偏移量,然后将其应用于 FFMPEG 命令,以确保没有同步问题。我相信您要找的是 FFProbe 中的“start_time”。
祝你好运!
答案2
尝试这个:
首先,将音频提取到原始容器
ffmpeg.exe -y -i a.mov -vn -acodec copy a.aac
如果你能在 Pro Tools 中使用它,那么你就大功告成了。否则,
ffmpeg.exe -y -i a.aac -acodec pcm_s16le a.wav