无法写入未知时间戳的数据包 av_interleaved_write_frame(): 无效参数

10

我正试图将具有以下输出的 .ts 文件转换为 mkv 格式:

ffmpeg version 4.3.1 Copyright (c) 2000-2020 the FFmpeg developers
  built with Apple clang version 12.0.0 (clang-1200.0.32.27)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/4.3.1_4 --enable-shared --enable-pthreads --enable-version3 --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librtmp --enable-libspeex --enable-libsoxr --enable-videotoolbox --disable-libjack --disable-indev=jack
  libavutil      56. 51.100 / 56. 51.100
  libavcodec     58. 91.100 / 58. 91.100
  libavformat    58. 45.100 / 58. 45.100
  libavdevice    58. 10.100 / 58. 10.100
  libavfilter     7. 85.100 /  7. 85.100
  libavresample   4.  0.  0 /  4.  0.  0
  libswscale      5.  7.100 /  5.  7.100
  libswresample   3.  7.100 /  3.  7.100
  libpostproc    55.  7.100 / 55.  7.100
[mp3float @ 0x7fbd6282b200] Header missing
[mpegts @ 0x7fbd62809000] PES packet size mismatch
[mpegts @ 0x7fbd62809000] Packet corrupt (stream = 2, dts = 7125804577).
[mpegts @ 0x7fbd62809000] PES packet size mismatch
[mpegts @ 0x7fbd62809000] Packet corrupt (stream = 2, dts = 7125804577).
[mpegts @ 0x7fbd62809000] PES packet size mismatch
[mpegts @ 0x7fbd62809000] Packet corrupt (stream = 1, dts = 7125790091).
Input #0, mpegts, from '/Users/"User"/Downloads/input.ts':
  Duration: 02:11:32.82, start: 71283.837456, bitrate: 17149 kb/s
  Program 1 
    Stream #0:0[0x1004]: Video: h264 (High) ([27][0][0][0] / 0x001B), yuvj420p(pc, bt709, progressive), 1280x720 [SAR 1:1 DAR 16:9], 50 fps, 2.08 tbr, 90k tbn, 100 tbc
    Stream #0:1[0x1104](swe): Audio: mp2 ([3][0][0][0] / 0x0003), 48000 Hz, stereo, fltp, 256 kb/s
    Stream #0:2[0x704](swe): Audio: ac3 ([129][0][0][0] / 0x0081), 48000 Hz, 5.1(side), fltp, 640 kb/s

为了实现这个目的,我使用以下命令:
ffmpeg -i input.ts -c copy output.mkv

但是转换失败,并出现以下错误:
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #0:2 -> #0:1 (copy)
Press [q] to stop, [?] for help
[matroska @ 0x7fb8c1808200] Timestamps are unset in a packet for stream 0. This is deprecated and will stop working in the future. Fix your code to set the timestamps properly
[matroska @ 0x7fb8c1808200] Can't write packet with unknown timestamp
av_interleaved_write_frame(): Invalid argument
[matroska @ 0x7fb8c1808200] Can't write packet with unknown timestamp
Error writing trailer of output.mkv: Invalid argument
frame=   27 fps=0.0 q=-1.0 Lsize=      74kB time=00:00:00.85 bitrate= 705.5kbits/s speed=  99x    
video:1092kB audio:35kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
Conversion failed!

我应该怎样才能修复这个问题?我已经尝试在开头添加-fflags +genpts,但它仍然失败。

编辑:我最终是使用了MKVToolNix解决了这个问题。

2个回答

21

对于其他遇到此问题的人,我曾有类似的问题,通过在输入之前添加-fflags +genpts,让其为我生成缺失的时间戳,问题得到了解决。

ffmpeg -fflags +genpts -i input.ts -c copy output.mkv

编辑:

另一种解决方案可能是将其转换为mp4而不是mkv(可能使用它作为中间人,然后再转换为mkv)。

极端情况:

我曾遇到一种情况,需要采取基本上是“核”选项将视频转换为带有其设置帧速率的原始流文件,然后将其放回mp4容器与音频一起。

首先找到应该是什么帧速率。

ffprobe -v quiet -loglevel panic -show_entries stream=avg_frame_rate -print_format flat -select_streams v <my_video>

它会输出类似于streams.stream.0.avg_frame_rate="60000/1001"的内容,我们关心引号中的内容60000/1001

按照该设定的帧速率将流转换为其本身的原始格式。例如,H264将进入一个.h264容器。

ffmpeg -fflags +genpts -ignore_editlist 1 -r 60000/1001 -i <my_video> -c:v copy -map 0:v -r 60000/1001 temp.h264

然后从临时文件中再次导入原始轨道 -map 0:v -c:v copy并混合音频-map 1:a -c:a copy和原始电影中的字幕-map 1:s -c:s copy

ffmpeg -fflags +genpts -r 60000/1001 -i temp.h264 -i <my_video> -c:v copy -map 0:v -map 1:a -map 1:s -c:a copy -c:s copy fixed_video.mp4

1
那对我的文件没有用,但可能对其他人有用。 - jagvetinte
1
谢谢,这对我有用,但是(如上所述),必须选择明确支持eac3的容器,比如.mkv。 - ArchNemSyS
1
这帮助我解决了尝试连接ogg/vorbis视频文件时遇到的错误。 - Ian

3

尝试使用-ss标志运行。

ffmpeg -ss 0:01 -i input.ts -c copy output.mkv

谢谢您的回答!我已经使用MKVToolNix解决了这个问题。 - jagvetinte
@jagvetinte 你是怎么解决的?对我来说,“-ss”参数只能消除一个时间戳错误。 - Horațiu Mlendea
我使用了MKVToolNix而不是ffmpeg。 - jagvetinte
好的,我仍然不确定您如何使用mkvtoolnix,但自那以后我设法解决了这个问题。我使用了ffmpeg -i [inputfile] [oututfile]而没有使用-c或其他映射流的方式。它最终对视频和音频流进行了转码,我不确定为什么,但对于我来说,在那种特定情况下已经足够了。 - Horațiu Mlendea
对我来说没问题。-ss 0:01 这个参数具体是做什么的? - danbtl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接