使用hstack ffmpeg合并会议视频和音频呼叫输出

时间:2017-10-16 12:52:35

标签: video ffmpeg

有两个视频和两个音频文件

Input #0, matroska,webm, from 'first.mkv':
  Metadata:
    encoder         : GStreamer matroskamux version 1.8.1.1
    creation_time   : 2017-10-16 14:13:15
  Duration: 00:06:01.24, start: 3.817000, bitrate: 1547 kb/s
    Stream #0:0(eng): Video: vp8, yuv420p, 640x480, SAR 1:1 DAR 4:3, 16.75 tbr, 1k tbn, 1k tbc (default)
    Metadata:
      title           : Video
Input #1, matroska,webm, from 'second.mkv':
  Metadata:
    encoder         : GStreamer matroskamux version 1.8.1.1
    creation_time   : 2017-10-16 14:13:24
  Duration: 00:05:49.79, start: 13.509000, bitrate: 810 kb/s
    Stream #1:0(eng): Video: vp8, yuv420p, 640x480, SAR 1:1 DAR 4:3, 1k tbr, 1k tbn, 1k tbc (default)
    Metadata:
      title           : Video
Input #2, matroska,webm, from 'first.mka':
  Metadata:
    encoder         : GStreamer matroskamux version 1.8.1.1
    creation_time   : 2017-10-16 14:13:15
  Duration: 00:06:01.30, start: 3.786000, bitrate: 46 kb/s
    Stream #3:0(eng): Audio: opus, 48000 Hz, stereo, fltp (default)
    Metadata:
      title           : Audio
Input #3, matroska,webm, from 'second.mka':
  Metadata:
    encoder         : GStreamer matroskamux version 1.8.1.1
    creation_time   : 2017-10-16 14:13:24
  Duration: 00:05:50.61, start: 13.498000, bitrate: 50 kb/s
    Stream #2:0(eng): Audio: opus, 48000 Hz, stereo, fltp (default)
    Metadata:
      title           : Audio

以上文件是视频会议电话的输出,想要将所有文件合并在一起并显示为并排视频。

视频和音频的开始时间不同,要分别同步视频和音频并将视频并排合并。

最初使用以下命令合并两个视频

ffmpeg -i first.mkv -i second.mkv -filter_complex "
[0:v]scale=320:240,pad=325:240,setsar=1[l];[1:v]scale=320:240,setsar=1[r];
[l][r]hstack" -c:v libx264 -preset ultrafast -crf 0 merged.mp4

之后使用以下命令按照@mulvya

的建议进行合并
ffmpeg -ss 00:00:09.692 -i first.mkv -i second.mkv -i first.mka -i second.mka -filter_complex "[0:v]scale=320:240,pad=325:240,setsar=1[l];[1:v]scale=320:240,setsar=1[r];[l][r]hstack=shortest=1[v];[3]adelay=9712|9712[3a];[2][3a]amerge[a]" -map '[v]' -map '[a]' -c:v libx264 -preset slower -crf 0 -c:a aac -ac 2 merged.mp4

-ss值视频开始时间的差异,adelay取得音频开始时间的差异

示例测试会议文件<​​/ p>

  1. https://drive.google.com/open?id=0ByVMq5U43FGlbXpXR3JtSnFTaWM

  2. https://drive.google.com/open?id=0ByVMq5U43FGlbENVRWlTWktQb3M

  3. https://drive.google.com/open?id=0ByVMq5U43FGldndlZDNpNWxWY2M

  4. https://drive.google.com/open?id=0ByVMq5U43FGlei1oRjNKeXRZbE0

  5. 现在面临音频同步问题,第二音频听力低。

    预期结果是第一个视频和第二个视频并排合并,音频应与合并视频同步。

    现在我可以使用以下命令

    获得所需的输出
    ffmpeg -i first.mkv -i second.mkv -i first.mka -i second.mka -filter_complex "[0]scale=320:240,pad=645:240,setsar=1[l];[1]scale=320:240,setpts=PTS-STARTPTS+9.723/TB,setsar=1[1v];[l][1v]overlay=x=325[v];[3]adelay=9712|9712[1a];[2]adelay=31|31[2a];[2a][1a]amerge=inputs=2[a]" -map '[v]' -map '[a]' -c:v libx264 -preset slower -crf 0 -c:a aac -ac 2 merged.mp4
    

    但又面临以下问题

    1. 第二个视频未正确编码卡在中间并播放。
    2. 音频同步问题。
    3. 转换过程很慢。如何使用hstack完成上述工作?
    4. 任何建议或帮助?

1 个答案:

答案 0 :(得分:2)

使用

ffmpeg -i first.mkv -i second.mkv -i 1st.wav -i 2nd.wav -filter_complex "
[0:v]scale=320:240,pad=325:240,setsar=1[l];[1:v]setpts=PTS+6/TB,scale=320:240,setsar=1[r];
[l][r]hstack=shortest=1,drawbox=325:0:c=black:t='max':enable='lt(t,6)'[v];
[3]adelay=6000|6000[3a];[2][1a]amerge[a]" -map '[v]' -map '[a]' -c:v libx264 -preset ultrafast -crf 0 -c:a aac -ac 2 merged.mp4

更新:对于当前上传的文件集,请使用以下命令

ffmpeg -i first.mkv -i second.mkv -c:a libopus -i first.mka -c:a libopus -i second.mka
 -filter_complex
        "[0]fps=30,scale=320:240,pad=645:240,setsar=1[l];
         [1]fps=30,scale=320:240,setpts=PTS-STARTPTS+3.981/TB,setsar=1[1v];
         [l][1v]overlay=x=325[v];
         [2]atrim=0.025,asetpts=PTS-STARTPTS,aresample=async=1,pan=stereo|c0=c0|c1=c1[2a];
         [3]atrim=0.012,asetpts=PTS-STARTPTS,aresample=async=1,adelay=3981|3981,pan=stereo|c0=c0|c1=c1[3a];
         [2a][3a]amerge=inputs=2[a]"
 -map "[v]" -map "[a]" -c:v libx264 -preset fast -crf 10 -c:a aac -ac 2 merged.mp4

first.mkv开始时间是07.930
first.mka开始时间是07.905
second.mkv开始时间是11.911
second.mka开始时间是11.899

这些音频文件使用未在ffmpeg的原生Opus解码器中实现的编解码器功能,因此强制使用外部解码器。

第一个视频文件fps未被检测到,因此对于这两个视频,我使用fps过滤器强制使用相同的帧速率。

为两个音频添加了atrim滤波器,其值等于音频和相应视频之间的开始时间差。修剪后的音频的时间戳必须通过asetpts重置。必须使用aresample填写录音中的任何空白。只有迟到的a / v应该有其音频adelay - ed,其值等于视频开始时间的差异。添加pan过滤器以修复amerge所需的频道布局。

preset变为快速。 CRF增加到100是一个很大的空间浪费)。