6

For a digital cinema package I need to extract the audio track (.wav, 48000 kHz, 16-bit) from QuickTime movies (in this case with Prores or Photo-JPEG codec). The catch is that the duration of the audio file has to have the exact same length in frames as the video track. The output wave file has to have 48000 kHz and 24-bit.

This is the command I tried:

"C:\Program Files (x86)\FFMPEG\bin\ffmpeg.exe" -i "input\path\file.mov" -vn -acodec pcm_s24le -ar 48000 "output\path\audio.wav"

I noticed that a lot of times the audio track is a couple of frames longer than the input QuickTime movie.  But when I extract the audio with Adobe Media Encoder, it always has the exact same frame length. This can be verified by importing audio and video into After Effects, for example.

Example:

  • input.mov consists of 1000 frames,
  • ffmpeg output.wav has something like 1003 frames,
  • AME output.wav has 1000 frames

Is there a way to make sure that ffmpeg does not produce audio tracks with a frame length shorter or longer than the original video?

Console Output:

ffmpeg started on 2015-01-29 at 20:32:44
Report written to "ffmpeg-20150129-203244.log"
Command line:
"C:\Program Files (x86)\FFMPEG\bin\ffmpeg.exe" -report -i "G:\01_dcp_pipeline\02_a_sound_ready\01_WOE_IS_ME_1080P_24FPS.mov" -vn -acodec pcm_s24le -ar 48000 "G:\01_dcp_pipeline\02_a_sound_ready\01_WOE_IS_ME_1080P_24FPS2.wav"
ffmpeg version N-69375-g4155f2d Copyright (c) 2000-2015 the FFmpeg developers
  built on Jan 28 2015 22:14:02 with gcc 4.9.2 (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-lzma --enable-decklink --enable-zlib
  libavutil  54. 18.100 / 54. 18.100
  libavcodec 56. 21.101 / 56. 21.101
  libavformat56. 19.100 / 56. 19.100
  libavdevice56.  4.100 / 56.  4.100
  libavfilter 5.  9.101 /  5.  9.101
  libswscale  3.  1.101 /  3.  1.101
  libswresample   1.  1.100 /  1.  1.100
  libpostproc53.  3.100 / 53.  3.100
Splitting the commandline.
Reading option '-report' ... matched as option 'report' (generate a report) with argument '1'.
Reading option '-i' ... matched as input file with argument 'G:\01_dcp_pipeline\02_a_sound_ready\01_WOE_IS_ME_1080P_24FPS.mov'.
Reading option '-vn' ... matched as option 'vn' (disable video) with argument '1'.
Reading option '-acodec' ... matched as option 'acodec' (force audio codec ('copy' to copy stream)) with argument 'pcm_s24le'.
Reading option '-ar' ... matched as option 'ar' (set audio sampling rate (in Hz)) with argument '48000'.
Reading option 'G:\01_dcp_pipeline\02_a_sound_ready\01_WOE_IS_ME_1080P_24FPS2.wav' ... matched as output file.
Finished splitting the commandline.
Parsing a group of options: global .
Applying option report (generate a report) with argument 1.
Successfully parsed a group of options.
Parsing a group of options: input file G:\01_dcp_pipeline\02_a_sound_ready\01_WOE_IS_ME_1080P_24FPS.mov.
Successfully parsed a group of options.
Opening an input file: G:\01_dcp_pipeline\02_a_sound_ready\01_WOE_IS_ME_1080P_24FPS.mov.
[mov,mp4,m4a,3gp,3g2,mj2 @ 000000000442d7c0] Format mov,mp4,m4a,3gp,3g2,mj2 probed with size=2048 and score=100
[mov,mp4,m4a,3gp,3g2,mj2 @ 000000000442d7c0] ISO: File Type Major Brand: qt  
[mov,mp4,m4a,3gp,3g2,mj2 @ 000000000442d7c0] Before avformat_find_stream_info() pos: 890445130 bytes read:186331 seeks:4
[mov,mp4,m4a,3gp,3g2,mj2 @ 000000000442d7c0] All info found
[mov,mp4,m4a,3gp,3g2,mj2 @ 000000000442d7c0] After avformat_find_stream_info() pos: 6279910 bytes read:1510667 seeks:6 frames:26
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'G:\01_dcp_pipeline\02_a_sound_ready\01_WOE_IS_ME_1080P_24FPS.mov':
  Metadata:
major_brand : qt  
minor_version   : 537199360
compatible_brands: qt  
creation_time   : 2014-07-02 14:05:41
  Duration: 00:02:23.00, start: 0.000000, bitrate: 49815 kb/s
Stream #0:0(eng), 25, 1/24: Video: prores (apch / 0x68637061), yuv422p10le(bt709), 1920x1080, 49684 kb/s, SAR 1920:1920 DAR 16:9, 24 fps, 24 tbr, 24 tbn, 24 tbc (default)
Metadata:
  creation_time   : 2014-07-02 14:05:41
  handler_name: Apple Alias Data Handler
  encoder : Apple ProRes 422 (HQ)
  timecode: 00:00:00:00
Stream #0:1(eng), 1, 1/48000: Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 120 kb/s (default)
Metadata:
  creation_time   : 2014-07-02 14:05:41
  handler_name: Apple Alias Data Handler
  timecode: 00:00:00:00
Stream #0:2(eng), 0, 1/24: Data: none (tmcd / 0x64636D74) (default)
Metadata:
  creation_time   : 2014-07-02 14:08:05
  handler_name: Apple Alias Data Handler
  timecode: 00:00:00:00
Successfully opened the file.
Parsing a group of options: output file G:\01_dcp_pipeline\02_a_sound_ready\01_WOE_IS_ME_1080P_24FPS2.wav.
Applying option vn (disable video) with argument 1.
Applying option acodec (force audio codec ('copy' to copy stream)) with argument pcm_s24le.
Applying option ar (set audio sampling rate (in Hz)) with argument 48000.
Successfully parsed a group of options.
Opening an output file: G:\01_dcp_pipeline\02_a_sound_ready\01_WOE_IS_ME_1080P_24FPS2.wav.
0

3 Answers 3

3

I've found the solution to my problem. The "apad" filter together with the "-shortest" tag will extend a sound track to the same length of a video track in ffmpeg.

This is how to use the apad filter in the windows command line (video and audio codec parameters are just examples):

"C:\Program Files (x86)\FFMPEG\bin\ffmpeg.exe" -i PATH/TO/INPUTVIDEO -filter_complex "[0:1]apad" -vcodec prores -profile:v 3 -acodec pcm_s24le -ar 48000 -shortest PATH/TO/OUTPUTVIDEO

More about the apad filter in the ffmpeg documentation: https://www.ffmpeg.org/ffmpeg-filters.html#apad

2
  • This solves the issue for short audio, but what about if the audio is longer? I just want to trim out the excess audio. How could I go about doing that? Commented Jun 19, 2020 at 12:40
  • 1
    Get the duration of the video track. If the audio is longer than that, reencode it with the -ss 0.00 (start time zero) and -t (enter duration of video track in sec) flags. This will cut off the excess audio. The following code will extract the audio track from a video source with the exact same duration of the video track. You have to replace the variables with your own: "!FFMPEG!" -y -r !frame_rate! -i "!INFILE!" -ss 0.00 -t !video_duration! -acodec pcm_s24le -ar 48000 -r !frame_rate! "!OUTFILE!.wav"
    – schmiddl
    Commented Jun 22, 2020 at 21:29
1

I think "-async 1" should solve the problem to extract the audio to be same length as video

2
  • 2
    This would be a better answer if you showed how to do it and explained why it works. Commented Nov 30, 2020 at 22:25
  • Perfect : ffmpeg -i in.mp4 -i in.mp3 -async 1 out.mp3
    – Dorian Grv
    Commented May 21, 2023 at 12:15
0

It's not stated what the framerate of your MOV is, and thus whether or not you will be needing to speed up the audio to match a correlate 23.976 to 24.000 speedup of your video to match the DCI DCP specs. This link outlines a DCP workflow that may be of help: http://johnpilgrim.net/client/reference/DCP/HOWTO.html (I am aware that this does not directly address the OP's question, but it may indirectly solve the problem.)

2
  • My problem is not being caused by a change of the frame rate! It also happens with films where I don't touch the frame rate at all.
    – schmiddl
    Commented Mar 5, 2015 at 10:25
  • The DCP workflow you propose on your website is not viable for me, because I need to automate all the necessary steps. Right now I have automated the scaling, frame rate conversion and format conversion with "filter_complex" in ffmpeg. The only thing that I can not get to work correctly is the audio extraction. Often I have to use Adobe Media Encoder to extract the audio, because it will always give me an audio track with the exact same frame length as the source film. ffmpeg will often produce an audio track that is between half a frame and 6 frames shorter than the source film.
    – schmiddl
    Commented Mar 5, 2015 at 12:17

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .