Concatene vídeos com / sem fluxo de áudio

3

Eu tenho vários vídeos na pasta, mas quando o primeiro não tem fluxo de áudio, o áudio desaparece no vídeo concatenado. O vídeo concatenado está correto se o primeiro vídeo tiver fluxo de áudio. Como posso concatenar vídeos sem perder o áudio? Alguém pode me ajudar? Agradecemos antecipadamente.

É meu trecho de código para concatenação

ffmpeg -f concat -i "1.txt" -c copy $OUTPUT_FILE

onde o arquivo "1.txt" contém uma lista de vídeos para concatenação

Eu posso omiti-lo adicionando o áudio silencioso no primeiro vídeo, se ele não tiver áudio, mas talvez alguém conheça melhor o caminho?

primeira informação de vídeo (do mplayer):

VIDEO:  [H264]  1920x1080  24bpp  30.000 fps  3691.0 kbps (450.6 kbyte/s)
Clip info:
 major_brand: isom
 minor_version: 512
 compatible_brands: isomiso2avc1mp41
 encoder: Lavf56.30.100
Load subtitles in ./
==========================================================================
Opening video decoder: [ffmpeg] FFmpeg's libavcodec codec family
libavcodec version 54.92.100 (external)
Selected video codec: [ffh264] vfm: ffmpeg (FFmpeg H.264)
==========================================================================
Audio: no sound

segunda informação de vídeo:

VIDEO:  [H264]  1920x1080  24bpp  30.000 fps  2761.4 kbps (337.1 kbyte/s)
Clip info:
 major_brand: isom
 minor_version: 512
 compatible_brands: isomiso2avc1mp41
 encoder: Lavf56.30.100
Load subtitles in ./
==========================================================================
Opening video decoder: [ffmpeg] FFmpeg's libavcodec codec family
libavcodec version 54.92.100 (external)
Selected video codec: [ffh264] vfm: ffmpeg (FFmpeg H.264)
==========================================================================
==========================================================================
Opening audio decoder: [ffmpeg] FFmpeg/libavcodec audio decoders
AUDIO: 44100 Hz, 2 ch, floatle, 128.0 kbit/4.53% (ratio: 15998->352800)
Selected audio codec: [ffaac] afm: ffmpeg (FFmpeg AAC (MPEG-2/MPEG-4 Audio))

saída do ffmpeg do primeiro vídeo

ffmpeg version 2.6.git Copyright (c) 2000-2015 the FFmpeg developers
  built with gcc 4.8.3 (GCC) 20140911 (Red Hat 4.8.3-7)
  configuration: --prefix=/root/ffmpeg_build --extra-cflags=-I/root/ffmpeg_build/include --extra-ldflags=-L/root/ffmpeg_build/lib --bindir=/root/bin --enable-gpl --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame --enable-libvorbis --enable-libvpx --enable-libx264 --enable-nonfree
  libavutil      54. 23.101 / 54. 23.101
  libavcodec     56. 35.101 / 56. 35.101
  libavformat    56. 30.100 / 56. 30.100
  libavdevice    56.  4.100 / 56.  4.100
  libavfilter     5. 14.100 /  5. 14.100
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  1.100 /  1.  1.100
  libpostproc    53.  3.100 / 53.  3.100
Input #0, image2, from '10000_full_400511img002.jpg':
  Duration: 00:00:00.04, start: 0.000000, bitrate: 58229 kb/s
    Stream #0:0: Video: mjpeg, yuvj420p(pc, bt470bg/unknown/unknown), 1920x1080 [SAR 1:1 DAR 16:9], 25 fps, 25 tbr, 25 tbn, 25 tbc
[swscaler @ 0x39560e0] deprecated pixel format used, make sure you did set range correctly
[libx264 @ 0x396cb60] -qscale is ignored, -crf is recommended.                                          
[libx264 @ 0x396cb60] using SAR=1/1
[libx264 @ 0x396cb60] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2
[libx264 @ 0x396cb60] profile High, level 4.0
[libx264 @ 0x396cb60] 264 - core 130 r2282 1db4621 - H.264/MPEG-4 AVC codec - Copyleft 2003-2013 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=6 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Output #0, mp4, to 'test_output.mp4':
  Metadata:
    encoder         : Lavf56.30.100
    Stream #0:0: Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], q=-1--1, 30 fps, 15360 tbn, 30 tbc
    Metadata:
      encoder         : Lavc56.35.101 libx264
Stream mapping:
  Stream #0:0 -> #0:0 (mjpeg (native) -> h264 (libx264))
Press [q] to stop, [?] for help
frame=   60 fps= 16 q=-1.0 Lsize=     324kB time=00:00:01.93 bitrate=1374.8kbits/s    
video:323kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.471130%
[libx264 @ 0x396cb60] frame I:1     Avg QP:18.03  size:321845
[libx264 @ 0x396cb60] frame P:15    Avg QP:16.15  size:   338
[libx264 @ 0x396cb60] frame B:44    Avg QP:13.72  size:    70
[libx264 @ 0x396cb60] consecutive B-frames:  1.7%  0.0%  5.0% 93.3%
[libx264 @ 0x396cb60] mb I  I16..4: 10.1% 89.7%  0.3%
[libx264 @ 0x396cb60] mb P  I16..4:  0.0%  0.0%  0.0%  P16..4:  1.6%  0.0%  0.0%  0.0%  0.0%    skip:98.4%
[libx264 @ 0x396cb60] mb B  I16..4:  0.0%  0.0%  0.0%  B16..8:  0.0%  0.0%  0.0%  direct: 0.0%  skip:100.0%  L0:49.1% L1:50.9% BI: 0.0%
[libx264 @ 0x396cb60] 8x8 transform intra:89.4% inter:99.1%
[libx264 @ 0x396cb60] coded y,uvDC,uvAC intra: 88.8% 88.3% 80.7% inter: 0.0% 0.4% 0.0%
[libx264 @ 0x396cb60] i16 v,h,dc,p: 98%  0%  2%  0%
[libx264 @ 0x396cb60] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 14% 21% 19%  6%  7%  6%  9%  8% 11%
[libx264 @ 0x396cb60] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu:  7% 18% 10%  7% 13%  9% 16%  6% 14%
[libx264 @ 0x396cb60] i8c dc,h,v,p: 53% 17% 16% 13%
[libx264 @ 0x396cb60] Weighted P-Frames: Y:0.0% UV:0.0%
[libx264 @ 0x396cb60] ref P L0: 93.4%  0.0%  3.7%  2.8%
[libx264 @ 0x396cb60] ref B L0: 52.8% 45.3%  1.9%
[libx264 @ 0x396cb60] kb/s:1320.02

Depois, criei o mesmo segundo vídeo e concatenei com áudio:

ffmpeg version 2.6.git Copyright (c) 2000-2015 the FFmpeg developers
  built with gcc 4.8.3 (GCC) 20140911 (Red Hat 4.8.3-7)
  configuration: --prefix=/root/ffmpeg_build --extra-cflags=-I/root/ffmpeg_build/include --extra-ldflags=-L/root/ffmpeg_build/lib --bindir=/root/bin --enable-gpl --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame --enable-libvorbis --enable-libvpx --enable-libx264 --enable-nonfree
  libavutil      54. 23.101 / 54. 23.101
  libavcodec     56. 35.101 / 56. 35.101
  libavformat    56. 30.100 / 56. 30.100
  libavdevice    56.  4.100 / 56.  4.100
  libavfilter     5. 14.100 /  5. 14.100
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  1.100 /  1.  1.100
  libpostproc    53.  3.100 / 53.  3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'test_output.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf56.30.100
  Duration: 00:00:02.00, start: 0.000000, bitrate: 1329 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 1322 kb/s, 30 fps, 30 tbr, 15360 tbn, 60 tbc (default)
    Metadata:
      handler_name    : VideoHandler
Input #1, mp3, from 'audio.mp3':
  Metadata:
    title           : Time (zaycev.net)
    artist          : ONUKA
    encoder         : Lavf56.30.100
  Duration: 00:00:02.01, start: 0.011995, bitrate: 130 kb/s
    Stream #1:0: Audio: mp3, 44100 Hz, stereo, s16p, 128 kb/s
    Metadata:
      encoder         : Lavc56.35
[mp4 @ 0x2c67040] Codec for stream 0 does not use global headers but container format requires global headers
Output #0, mp4, to 'final.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf56.30.100
    Stream #0:0(und): Video: h264 ([33][0][0][0] / 0x0021), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 1322 kb/s, 30 fps, 30 tbr, 15360 tbn, 15360 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1: Audio: aac ([64][0][0][0] / 0x0040), 44100 Hz, stereo, fltp, 128 kb/s
    Metadata:
      encoder         : Lavc56.35.101 aac
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #1:0 -> #0:1 (mp3 (native) -> aac (native))
Press [q] to stop, [?] for help
frame=   60 fps=0.0 q=-1.0 Lsize=     359kB time=00:00:02.02 bitrate=1454.4kbits/s    
video:323kB audio:32kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.959931%

Depois disso, concatenei dois vídeos e obtive resultados. Saída do programa ffmpeg no caso de o primeiro vídeo não ter áudio:

  ffmpeg version 2.6.git Copyright (c) 2000-2015 the FFmpeg developers
      built with gcc 4.8.3 (GCC) 20140911 (Red Hat 4.8.3-7)
      configuration: --prefix=/root/ffmpeg_build --extra-cflags=-I/root/ffmpeg_build/include --extra-ldflags=-L/root/ffmpeg_build/lib --bindir=/root/bin --enable-gpl --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame --enable-libvorbis --enable-libvpx --enable-libx264 --enable-nonfree
      libavutil      54. 23.101 / 54. 23.101
      libavcodec     56. 35.101 / 56. 35.101
      libavformat    56. 30.100 / 56. 30.100
      libavdevice    56.  4.100 / 56.  4.100
      libavfilter     5. 14.100 /  5. 14.100
      libswscale      3.  1.101 /  3.  1.101
      libswresample   1.  1.100 /  1.  1.100
      libpostproc    53.  3.100 / 53.  3.100
    Input #0, concat, from '1.txt':
      Duration: N/A, start: 0.000000, bitrate: 3691 kb/s
        Stream #0:0: Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 3691 kb/s, 30 fps, 30 tbr, 90k tbn, 60 tbc
    [mp4 @ 0x2b5e580] Codec for stream 0 does not use global headers but container format requires global headers
    Output #0, mp4, to 'final.mp4':
      Metadata:
        encoder         : Lavf56.30.100
        Stream #0:0: Video: h264 ([33][0][0][0] / 0x0021), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 3691 kb/s, 30 fps, 30 tbr, 90k tbn, 90k tbc
    Stream mapping:
      Stream #0:0 -> #0:0 (copy)
    Press [q] to stop, [?] for help
    [concat @ 0x2b501c0] New audio stream 0:1 at pos:259207 and DTS:12.267s
    frame=  824 fps=0.0 q=-1.0 Lsize=   10660kB time=00:00:27.39 bitrate=3188.2kbits/s    
    video:10651kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.088069%
    
por KravAn 16.06.2015 / 21:13

1 resposta

1

De a documentação do FFmpeg no formato concat :

All files must have the same streams (same codecs, same time base, etc.).

Observe que a documentação do filtro concat tem requisitos semelhantes:

The filter works on segments of synchronized video and audio streams. All segments must have the same number of streams of each type, and that will also be the number of streams at output.

O truque aqui é que, para que a operação concat funcione corretamente, é necessário que um fluxo de áudio esteja presente no primeiro arquivo de vídeo "silencioso" para que o codificador de áudio seja usado em todo o processo. da sua codificação concatenada. Você pode adicionar um fluxo de áudio silencioso no momento da criação do primeiro arquivo usando a fonte de áudio aevalsrc com um valor de 0 :

ffmpeg \
-f image2 -i [your image-set name info here] \
-f lavfi -i aevalsrc=0 \
-map 0 -map 1 -shortest \
-c:v libx264 [your X264 params here, same settings as in your 2nd file to concat] \
-c:a aac -strict experimental [your aac params here, same settings as in your 2nd file] \
/path/to/output/file/output_file.mp4
    
por 20.06.2015 / 02:19