【问题标题】:FFmpeg custom build support for converting .ts to .mp4 filesFFmpeg 自定义构建支持将 .ts 转换为 .mp4 文件
【发布时间】:2021-11-04 16:39:32
【问题描述】:

ffmpeg.js 使用自定义构建的 FFmpeg 以保持其较小的大小。我正在尝试将.ts 转换为.mp4,这在我的桌面上一直是一件容易的事(尤其是因为它们甚至使用相同的编解码器、aac 和 h.264),但是在自定义构建中,我得到了错误sample1.ts: Invalid data found when processing input

正在运行的命令是ffmpeg -i sample1.ts -report -c copy out.mp4

我在这个主题上看到的其他问题超出了对输入文件的初始阅读,我找不到关于我的问题是什么或如何解决它的好资源。

这是一个相当难以描述的错误,所以我不确定到底是什么问题。我认为这意味着此版本不支持ts 文件,但我什至不确定这在编解码器和复用器方面意味着什么。

从自定义构建文件中,启用的解复用器和解码器是

COMMON_DEMUXERS = matroska ogg mov mp3 wav image2 concat
COMMON_DECODERS = vp8 h264 vorbis opus mp3 aac pcm_s16le mjpeg png

这些用于--enable-demuxer--enable-decoder 标志。

我在解码器中同时看到 h264 和 aac,所以我不明白为什么会出现编解码器问题。

它确实适用于某些文件类型,因此问题不是构建本身。

我曾尝试添加像mpeg2 这样的解复用器和解码器,但这只是为我赢得了WARNING: Option --enable-decoder=mpeg2 did not match anything

我使用-report 标志时的完整输出是

./this.program -i sample1.ts -report -c copy out.mp4
ffmpeg version n4.2.2 Copyright (c) 2000-2019 the FFmpeg developers
  built with emcc (Emscripten gcc/clang-like replacement) 1.39.11
  configuration: --cc=emcc --ranlib=emranlib --enable-cross-compile --target-os=none --arch=x86 --disable-runtime-cpudetect --disable-asm --disable-fast-unaligned --disable-pthreads --disable-w32threads --disable-os2threads --disable-debug --disable-stripping --disable-safe-bitstream-reader --disable-all --enable-ffmpeg --enable-avcodec --enable-avformat --enable-avfilter --enable-swresample --enable-swscale --disable-network --disable-d3d11va --disable-dxva2 --disable-vaapi --disable-vdpau --enable-decoder=vp8 --enable-decoder=h264 --enable-decoder=vorbis --enable-decoder=opus --enable-decoder=mp3 --enable-decoder=aac --enable-decoder=pcm_s16le --enable-decoder=mjpeg --enable-decoder=png --enable-demuxer=matroska --enable-demuxer=ogg --enable-demuxer=mov --enable-demuxer=mp3 --enable-demuxer=wav --enable-demuxer=image2 --enable-demuxer=concat --enable-protocol=file --enable-filter=aresample --enable-filter=scale --enable-filter=crop --enable-filter=overlay --enable-filter=hstack --enable-filter=vstack --dis  libavutil      56. 31.100 / 56. 31.100
  libavcodec     58. 54.100 / 58. 54.100
  libavformat    58. 29.100 / 58. 29.100
  libavfilter     7. 57.100 /  7. 57.100
  libswscale      5.  5.100 /  5.  5.100
  libswresample   3.  5.100 /  3.  5.100
Splitting the commandline.
Reading option '-i' ... matched as input url with argument 'sample1.ts'.
Reading option '-report' ... matched as option 'report' (generate a report) with argument '1'.
Reading option '-c' ... matched as option 'c' (codec name) with argument 'copy'.
Reading option 'out.mp4' ... matched as output url.
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 url sample1.ts.
Successfully parsed a group of options.
Opening an input file: sample1.ts.
[NULL @ 0x72c300] Opening 'sample1.ts' for reading
[file @ 0x72c9f0] Setting default whitelist 'file,crypto'
[AVIOContext @ 0x734ab0] Statistics: 448192 bytes read, 0 seeks
sample1.ts: Invalid data found when processing input

【问题讨论】:

  • “我相信他们甚至使用相同的编解码器,aac 和 h.264” 这是重要的信息。请验证 ts 文件中包含的格式。其他 ts 文件是否具有相同的格式,或者它们是任意的?您是重新编码还是仅重新混合?
  • 是的,我的桌面 FFmpeg 输出 Stream #0:1[0x100]: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p(progressive), 1280x720, 30 fps, 30 tbr, 90k tbn, 60 tbc Stream #0:2[0x101]: Audio: aac (LC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp, 140 kb/s。所有文件都将完全相同,我认为我只需要重新混合,因为我不需要更改编解码器。
  • 是的,其他 ts 文件格式相同(H.264 + AAC)?或者是的,它们将是任意/随机/混合的?你是重新编码(ffmpeg -i input.ts output.mp4)还是只重新复用/stream copyingffmpeg -i input.ts -c copy output.ts)?
  • 所有输入都是完全相同的文件类型,我正在流式复制。

标签: ffmpeg mp4 transport-stream ffmpeg.js


【解决方案1】:

这与How to compile ffmpeg to get only mp3 and mp4 support 非常相似,但有几个不同的编译选项:

./configure --disable-everything --disable-network --disable-autodetect --enable-small --enable-demuxer=mpegts --enable-muxer=mp4 --enable-parser=aac,h264 --enable-decoder=aac,h264 --enable-protocol=file

以上链接了解更多详情。

【讨论】:

  • 这对我来说更像是下一步。该答案的这一行--enable-demuxer=mov,m4v,matroska 假设我知道哪些复用器是必需的。
  • 我实际上认为我刚刚想通了。我需要mpegts 复用器。
  • @AidanDempster 您的问题暗示您仅将自定义 ffmpeg 用于 .ts 到 .mp4 重新混合。在这种情况下,您不需要 mpegts 多路复用器。您只需要 mpegts demuxer 和 mp4 muxer。
  • 是的,你说得对。而且我正在尝试尽可能减少二进制文件的大小,因此我将不得不去修剪我不使用的多路复用器和编解码器。
【解决方案2】:

更新:

在洛根的提示下我想通了

您是重新编码 (ffmpeg -i input.ts output.mp4) 还是仅重新复用/流复制 (ffmpeg -i input.ts -c copy output.ts)?

这意味着问题出在多路复用器上。具体来说,我将mpegts 放在解码器部分下,因为我误解了其中的区别。将其移至解复用器部分解决了该问题。

还有第二个问题。 FFmpeg.js 使用 --disable-all 选项构建,这意味着它还禁用了许多其他东西。

  1. 我必须通过将--enable-bsf=aac_adtstoasc 添加到配置调用来手动启用比特流过滤器。
  2. 这也引起了另一个我还不太明白的问题。我还需要手动设置 --enable-parser=h264--enable-parser=aac 以使视频正确复用 (Source)。
  3. 最后,为了连接 ts 文件,我还需要使用 --enable-protocol=concat 手动启用该协议。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-17
    • 1970-01-01
    • 2012-08-15
    • 2016-01-14
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多