FFmpeg 自定义构建支持将 .ts 转换为 .mp4 文件
FFmpeg custom build support for converting .ts to .mp4 files
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
文件,但我什至不确定这在编解码器和多路复用器方面意味着什么。
在自定义构建 make 文件中,启用的多路分解器和解码器是
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
这与 非常相似,但有一些不同的编译选项:
./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
以上 link 了解更多详情。
更新:
在 logan 的提示下我明白了这一点
Are you re-encoding (ffmpeg -i input.ts output.mp4) or only re-muxing/stream copying (ffmpeg -i input.ts -c copy output.ts)?
这意味着问题出在混合器上。具体来说,我将 mpegts
放在解码器部分下,因为我误解了其中的区别。将其移至分离器部分解决了该问题。
还有第二个问题。 FFmpeg.js
使用 --disable-all
选项构建,这意味着它还会禁用很多其他内容。
- 我必须通过将
--enable-bsf=aac_adtstoasc
添加到配置调用来手动启用比特流过滤器。
- 这也导致了另一个问题,我仍然不太明白。我还需要手动设置
--enable-parser=h264
和 --enable-parser=aac
以使视频正确混合 (Source)。
- 最后,为了连接 ts 文件,我还需要使用
--enable-protocol=concat
手动启用该协议。
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
文件,但我什至不确定这在编解码器和多路复用器方面意味着什么。
在自定义构建 make 文件中,启用的多路分解器和解码器是
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
这与
./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
以上 link 了解更多详情。
更新:
在 logan 的提示下我明白了这一点
Are you re-encoding (ffmpeg -i input.ts output.mp4) or only re-muxing/stream copying (ffmpeg -i input.ts -c copy output.ts)?
这意味着问题出在混合器上。具体来说,我将 mpegts
放在解码器部分下,因为我误解了其中的区别。将其移至分离器部分解决了该问题。
还有第二个问题。 FFmpeg.js
使用 --disable-all
选项构建,这意味着它还会禁用很多其他内容。
- 我必须通过将
--enable-bsf=aac_adtstoasc
添加到配置调用来手动启用比特流过滤器。 - 这也导致了另一个问题,我仍然不太明白。我还需要手动设置
--enable-parser=h264
和--enable-parser=aac
以使视频正确混合 (Source)。 - 最后,为了连接 ts 文件,我还需要使用
--enable-protocol=concat
手动启用该协议。