如何解决ffmpeg:添加具有正确编解码器类型标记的流非混合流
在常用的情况下,我认为 ffmpeg 要求输入采用指定的多路复用器格式,该格式包含一个或多个数据流,这些数据流可以使用与该格式关联的多路分配器支持的编解码器进行解码。我有一个数据流(不是音频或视频),它已经用编解码器编码但没有混合。 如何将这个流放入分配了正确编解码器类型的 ffmpeg 管道,以便复用器知道如何处理它?
我尝试通过 UDP 传输数据并指定 data
分路器。通过某些组合,我可以说它正在流式传输,我永远无法让播放器连接,这可能是因为 mpegts
的输出为空或无效。命令行:
ffmpeg -v verbose ^
-f flv -listen 1 -i rtmp://127.0.0.1:1101 ^
-f data -i udp://127.0.0.1:1300 ^
-map 0:v -vcodec mpeg2video -map 1:d -f mpegts -mpegts_m2ts_mode 1 udp://localhost:1200
结果(部分):
Input #0,flv,from 'rtmp://127.0.0.1:1101':
Metadata:
encoder : Lavf58.29.100
Duration: 00:00:00.00,start: 0.000000,bitrate: N/A
Stream #0:0: Video: h264 (Constrained Baseline),1 reference frame,yuv420p(progressive,left),5760x1080 (5760x1088),30 fps,30 tbr,1k tbn,60 tbc
Stream #0:1: Audio: mp3,48000 Hz,stereo,fltp,128 kb/s
Input #1,data,from 'udp://127.0.0.1:1300':
Duration: N/A,bitrate: N/A
Stream #1:0: Data: none
Stream mapping:
Stream #0:0 -> #0:0 (h264 (native) -> mpeg2video (native))
Stream #1:0 -> #0:1 (copy)
Press [q] to stop,[?] for help
[h264 @ 00000180d48ae700] Reinit context to 5760x1088,pix_fmt: yuv420p
[graph 0 input from stream 0:0 @ 00000180d489dcc0] w:5760 h:1080 pixfmt:yuv420p tb:1/1000 fr:30/1 sar:0/1
[mpegts @ 00000180d5f64040] Cannot automatically assign PID for stream 1
Could not write header for output file #0 (incorrect codec parameters ?): Invalid argument
Error initializing output stream 0:0 --
[AVIOContext @ 00000180d48b83c0] Statistics: 0 seeks,0 writeouts
[AVIOContext @ 00000180d4882080] Statistics: 185593 bytes read,0 seeks
[AVIOContext @ 00000180d5f469c0] Statistics: 204 bytes read,0 seeks
Conversion Failed!
编解码器类型名称为 klv
,其标签为 KLVA
。它仅受 mpegts
和 mxf
(de)muxers 支持。我认为必须有一种方法可以在没有有效的 mpegts
或 mxf
流的情况下进入管道,否则我们会遇到一种悖论。
我尝试在输入上指定编解码器,但验证失败,我猜是因为 data
分路器不支持它。
不知何故可以从元素流(mp4
和 h264
文件)中混合 aac
文件,但我想代码中必须有一些特殊情况来强制基于文件扩展名。
我真的很想从命令行使用公共构建来做到这一点,但如果这绝对不可能,我也欢迎一些关于可以通过 C++ 代码实现的建议。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。