FFmpeg - 具有不同时基的Concat视频

时间:2017-01-17 15:52:02

标签: video ffmpeg

我正在尝试使用concat demuxer连接视频,但在使用一个视频时它不起作用(下面的“video2.mp4”)。通过不起作用,我的意思是播放播放器上的连接视频将一直工作,直到第二个视频部分开始(它再也无法读取视频)。它适用于concat过滤器。它们都是mp4视频,所以我认为这是因为时间基准?我可以使用concat demuxer连接其他视频,它工作正常(即使具有不同的分辨率/比特率)。只有在尝试连接“video2.mp4”时才会发生。

此外,我有很多这样的警告/错误,可能是当ffmpeg开始连接第二个视频时:

        @model WebApplication1.Models.FileUploadModel

        @using (Html.BeginForm("PostForm", "FileUploadDemo", FormMethod.Post, new { enctype = "multipart/form-data" }))
        { 

        <div class="panel">
            <div class="panel-body">
                <div class="form-group row">
                    <div class="col-md-2 form-label">
                        <label>Name:</label>
                    </div>
                    <div class="col-md-6">
                        @Html.TextAreaFor(x => x.Name, new { @class = "form-control" })
                    </div>

                </div>

                <div class="form-group row">
                    <div class="col-md-2 form-label">
                        <label>Date</label>
                    </div>
                    <div class="col-md-6">
                        @Html.TextAreaFor(x => x.ValidFromDate, new { @class = "form-control" })
                    </div>

                </div>
                <div class="col-md-10">
                    <div class="form-group row">
                        <div class="col-md-2 form-label">
                            <label>Select File<i class="required-field">*</i>:</label>
                        </div>
                        <div class="col-md-8">
                            <input type="file" class="file-upload" style="margin: 0px;" hidden="hidden" accept=".xlsx" name="file" id="file" />
                        </div>
                    </div>
                </div>

                <div class="form-group row">
                    <div class="col-md-3 pull-right text-right">
                        <button class="btn btn-primary" id="process-submission"  type="submit" 
                                >Submit</button>

                    </div>
                </div>
            </div>
        </div>
        }

获得最短连续时间的最佳方法是什么?我真的需要使用concat过滤器,还是可以更改“video1.mp4”的时基,如果它确实是问题?

任何帮助将不胜感激,谢谢!

视频1:

[mp4 @ 0x7f847a814800] Non-monotonous DTS in output stream 0:0; previous: 906906, current: 302359; changing to 906907. This may result in incorrect timestamps in the output file.

视频2:

ffprobe version 3.2.2 Copyright (c) 2007-2016 the FFmpeg developers
  built with Apple LLVM version 8.0.0 (clang-800.0.42.1)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/3.2.2 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-libmp3lame --enable-libx264 --enable-libxvid --enable-opencl --disable-lzma --enable-vda
  libavutil      55. 34.100 / 55. 34.100
  libavcodec     57. 64.101 / 57. 64.101
  libavformat    57. 56.100 / 57. 56.100
  libavdevice    57.  1.100 / 57.  1.100
  libavfilter     6. 65.100 /  6. 65.100
  libavresample   3.  1.  0 /  3.  1.  0
  libswscale      4.  2.100 /  4.  2.100
  libswresample   2.  3.100 /  2.  3.100
  libpostproc    54.  1.100 / 54.  1.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'video1.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: isommp42
    creation_time   : 2016-08-17T22:50:35.000000Z
  Duration: 00:00:10.11, start: 0.000000, bitrate: 38018 kb/s
    Stream #0:0(eng): Video: h264 (Baseline) (avc1 / 0x31637661), yuv420p, 1696x848, 37832 kb/s, 29.97 fps, 29.97 tbr, 90k tbn, 180k tbc (default)
    Metadata:
      creation_time   : 2016-08-18T00:02:24.000000Z
      handler_name    : VideoHandle
    Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 189 kb/s (default)
    Metadata:
      creation_time   : 2016-08-18T00:02:24.000000Z
      handler_name    : SoundHandle 

FFMpeg命令:

ffprobe version 3.2.2 Copyright (c) 2007-2016 the FFmpeg developers
  built with Apple LLVM version 8.0.0 (clang-800.0.42.1)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/3.2.2 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-libmp3lame --enable-libx264 --enable-libxvid --enable-opencl --disable-lzma --enable-vda
  libavutil      55. 34.100 / 55. 34.100
  libavcodec     57. 64.101 / 57. 64.101
  libavformat    57. 56.100 / 57. 56.100
  libavdevice    57.  1.100 / 57.  1.100
  libavfilter     6. 65.100 /  6. 65.100
  libavresample   3.  1.  0 /  3.  1.  0
  libswscale      4.  2.100 /  4.  2.100
  libswresample   2.  3.100 /  2.  3.100
  libpostproc    54.  1.100 / 54.  1.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'video2.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: mp42mp41
    creation_time   : 2017-01-06T22:30:23.000000Z
  Duration: 00:00:08.19, start: 0.000000, bitrate: 101474 kb/s
    Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709), 4096x2048 [SAR 1:1 DAR 2:1], 101549 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc (default)
    Metadata:
      creation_time   : 2017-01-06T22:30:23.000000Z
      handler_name    : ?Mainconcept Video Media Handler
      encoder         : AVC Coding
    Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 125 kb/s (default)
    Metadata:
      creation_time   : 2017-01-06T22:30:23.000000Z
      handler_name    : #Mainconcept MP4 Sound Media Handler 

concat.txt:

ffmpeg -f concat -safe 0 -i concat.txt -c copy result.mp4

命令结果:

file '/path/to/video1.mp4'
file '/path/to/video2.mp4' 

提前谢谢!

3 个答案:

答案 0 :(得分:2)

在video2.mp4

中有关于H.264比特流的问题

以下步骤(适用一次)为我解决了这个问题,最终结果可以与ffplay,Potplayer,VLC,WMP,Chrome和Firefox一起使用。

#1 转换视频2以匹配视频1

ffmpeg -i video2.mp4 -vf scale=1696x848 -profile:v baseline -c:a copy v2.mp4

#2 提取到原始比特流

ffmpeg -i v2.mp4 -c copy -f h264 v2.h264

#3 将其与新容器混合

ffmpeg -i v2.h264 -i v2.mp4 -c copy -video_track_timescale 90000 -map 0 -map 1:a v2-ok.mp4

现在,您可以使用video1.mp4

连接v2-ok.mp4

答案 1 :(得分:0)

我认为,问题的关键在于,在检查上述两个视频时,它们显然具有截然不同的比特率。与其他因素不同,这是一个只能通过重新编码才能解决的问题。

根据用户发布的数据,视频1的视频比特率为37,832 kb / s,而视频2的不同视频比特率则为101,549 kb / s。

无论采取任何其他措施(例如匹配帧大小),视频播放器都将在连接点处暂停,因为它必须调整以(低)初始比特率累积和显示数据,然后开始以新的(更高)比特率显示修改后的图像。

有趣的是,如果问题是通过另一种方式向播放器造成的,则情况可能并非如此(即可能不会引起注意):如果视频1已以高比特率编码,然后合并的文件已丢弃降低比特率。在那种情况下,对于电影的两半来说,缓冲的初始水平将绰绰有余,因为后半部分将需要较少的缓冲。根据我的经验,回放的暂停是由于必须提高连接点的缓冲速率(需要缓冲更多数据的时间)的结果,而如果降低缓冲速率则不会发生。

此外,我还要指出差异的极端性质。比特率增加了200%,新的比特率是每秒初始大小的3倍。对于玩家来说,这确实是一个极大的挑战,玩家一直在以一种速率陶醉,然后遇到比特率的瞬时(永久)三倍增长。如果跳转是适度的,则可能根本无法察觉到播放的暂停。但是,如果比特率增加了两倍,而没有发出警告,则初始视频缓冲区几乎没有机会使其平滑,并且势必需要时间来缓冲其他数据。甚至不是数据速率的峰值,而是永久的增长。

难怪有些玩家会崩溃。它对于任何视频软件播放器的健壮性都说很多,它只是在遇到这种情况时会暂停或停顿。总体而言,如果增加幅度不到初始比特率的50%,我不会期望停顿,但是增加200%只是在乞求麻烦。

很明显,如果您不均衡图像的帧大小,即使缓冲完全足够,更改也会非常明显。我要说的是,即使视频1和视频2的图像大小相同,只要比特率在连接点跃升到更高的值,回放仍然会出现暂停。

答案 2 :(得分:0)

问题是时基。 Ffmpeg在第二个流中添加了偏移量,但是即使应该也不会更改其时间戳。

我从来没有获得任何与时基相关的选项来执行任何操作。对我有用的是:复制到mkv,该视频源具有视频流的1/1000时基(ffmpeg将其报告为“ 1k tbn”)。这使所有时间戳保持一致。然后concat。

出于正常目的,webm和mkv本质上是同一件事,但是mkv接受H.264,而webm当前不接受。

请注意,由于舍入而产生的任何轻微抖动的时间戳,都可能导致丢帧或重复帧,而这些帧的fps更改滤波器设计不良。

如果仍然存在间隙(但没有速度变化或错误消息),请确保音频的长度不比视频流稍长,并在必要时进行修剪;您可以使用“ ffmpeg -i video1.mp4 -i video1.mp4 -c复制-map 0:v -map 1:a -shortest trimmed.mp4”自动执行此操作。

我将这个答案粘贴到两个问题上,不知道是否允许这样做。