我正在进行一个项目,我只需要将FFMEPG用作解复用器复用器,以便接收带有音频和视频流的MPEG源,并分别输出不同的流。我还需要它来引入尽可能小的延迟。为了做到这一点,我有关于输入的所有必要信息:使用的容器、音频和视频编解码器、音频和音频速率以及音频通道,所以我想向FFMPEG提供这些信息,并避免验证阶段。然而,如果不指定一个大问题,我就无法让FFMPEG工作,这会导致延迟,并且根据输入,会导致FFMPEG由于无法获得所需信息(我事先有)而失败。

我一直在研究FFMPEG提供的不同选项,我发现以下选项可以帮助我:

  • -codec:a-codec:v以提供关于输入的音频和视频编解码器的信息。
  • -f 以提供关于所用容器的信息。
  • -r:v 以提供关于视频帧速率的信息。(我也尝试过-framerate,但似乎只有少数解复用器支持,mpeg不是其中之一)。
  • -probesize 以避免花费时间探测输入,因为我可以提供信息。
  • -copy_unknown 只需复制流,而不是在无法识别的情况下失败。

对于所有这些,我使用以下命令:./ffmpeg -hide_banner -loglevel debug -codec:v h264 -codec:a pcm_alaw -flags low_delay -probesize 32 -analyzeduration 0 -r:v 15 -f mpeg -i udp://127.0.0.1:41071?listen -y -map 0:a:0? -acodec copy -copy_unknown -ar 8000 -payload_type 8 -f rtp udp://127.0.0.1:33605?pkt_size=1200 -map 0:v:0? -vcodec copy -copy_unknown -payload_type 96 -f rtp udp://127.0.0.1:48527?pkt_size=1200

Splitting the commandline.
Reading option '-hide_banner' ... matched as option 'hide_banner' (do not show program banner) with argument '1'.
Reading option '-loglevel' ... matched as option 'loglevel' (set logging level) with argument 'debug'.
Reading option '-codec:v' ... matched as option 'codec' (codec name) with argument 'h264'.
Reading option '-codec:a' ... matched as option 'codec' (codec name) with argument 'pcm_alaw'.
Reading option '-flags' ... matched as AVOption 'flags' with argument 'low_delay'.
Reading option '-probesize' ... matched as AVOption 'probesize' with argument '32'.
Reading option '-analyzeduration' ... matched as AVOption 'analyzeduration' with argument '0'.
Reading option '-r:v' ... matched as option 'r' (set frame rate (Hz value, fraction or abbreviation)) with argument '15'.
Reading option '-f' ... matched as option 'f' (force format) with argument 'mpeg'.
Reading option '-i' ... matched as input url with argument 'udp://127.0.0.1:41071?listen'.
Reading option '-y' ... matched as option 'y' (overwrite output files) with argument '1'.
Reading option '-map' ... matched as option 'map' (set input stream mapping) with argument '0:a:0?'.
Reading option '-acodec' ... matched as option 'acodec' (force audio codec ('copy' to copy stream)) with argument 'copy'.
Reading option '-copy_unknown' ... matched as option 'copy_unknown' (Copy unknown stream types) with argument '1'.
Reading option '-ar' ... matched as option 'ar' (set audio sampling rate (in Hz)) with argument '8000'.
Reading option '-payload_type' ... matched as AVOption 'payload_type' with argument '8'.
Reading option '-f' ... matched as option 'f' (force format) with argument 'rtp'.
Reading option 'udp://127.0.0.1:33605?pkt_size=1200' ... matched as output url.
Reading option '-map' ... matched as option 'map' (set input stream mapping) with argument '0:v:0?'.
Reading option '-vcodec' ... matched as option 'vcodec' (force video codec ('copy' to copy stream)) with argument 'copy'.
Reading option '-copy_unknown' ... matched as option 'copy_unknown' (Copy unknown stream types) with argument '1'.
Reading option '-payload_type' ... matched as AVOption 'payload_type' with argument '96'.
Reading option '-f' ... matched as option 'f' (force format) with argument 'rtp'.
Reading option 'udp://127.0.0.1:48527?pkt_size=1200' ... matched as output url.
Finished splitting the commandline.
Parsing a group of options: global .
Applying option hide_banner (do not show program banner) with argument 1.
Applying option loglevel (set logging level) with argument debug.
Applying option y (overwrite output files) with argument 1.
Applying option copy_unknown (Copy unknown stream types) with argument 1.
    Last message repeated 1 times
Successfully parsed a group of options.
Parsing a group of options: input url udp://127.0.0.1:41071?listen.
Applying option codec:v (codec name) with argument h264.
Applying option codec:a (codec name) with argument pcm_alaw.
Applying option r:v (set frame rate (Hz value, fraction or abbreviation)) with argument 15.
Applying option f (force format) with argument mpeg.
Successfully parsed a group of options.
Opening an input file: udp://127.0.0.1:41071?listen.
[mpeg @ 0x55a769cc3d40] Opening 'udp://127.0.0.1:41071?listen' for reading
[udp @ 0x55a769cc4b00] No default whitelist set
[udp @ 0x55a769cc4b00] end receive buffer size reported is 425984
[mpeg @ 0x55a769cc3d40] Before avformat_find_stream_info() pos: 6 bytes read:40 seeks:0 nb_streams:0
[mpeg @ 0x55a769cc3d40] probing stream 1 pp:2500
[mpeg @ 0x55a769cc3d40] probed stream 1
[mpeg @ 0x55a769cc3d40] parser not found for codec pcm_alaw, packets or times may be invalid.
[mpeg @ 0x55a769cc3d40] Probe buffer size limit of 32 bytes reached
[mpeg @ 0x55a769cc3d40] Stream #0: not enough frames to estimate rate; consider increasing probesize
[mpeg @ 0x55a769cc3d40] Could not find codec parameters for stream 0 (Video: h264, 1 reference frame, none): unspecified size
Consider increasing the value for the 'analyzeduration' (0) and 'probesize' (32) options
[mpeg @ 0x55a769cc3d40] After avformat_find_stream_info() pos: 87804 bytes read:88476 seeks:0 frames:1
Input #0, mpeg, from 'udp://127.0.0.1:41071?listen':
  Duration: N/A, start: 50436.772978, bitrate: 64 kb/s
  Stream #0:0[0x1e0], 0, 1/90000: Video: h264, 1 reference frame, none, 90k tbr, 90k tbn
  Stream #0:1[0x1c0], 1, 1/90000: Audio: pcm_alaw, 8000 Hz, mono, s16, 64 kb/s
Successfully opened the file.
Parsing a group of options: output url udp://127.0.0.1:33605?pkt_size=1200.
Applying option map (set input stream mapping) with argument 0:a:0?.
Applying option acodec (force audio codec ('copy' to copy stream)) with argument copy.
Applying option ar (set audio sampling rate (in Hz)) with argument 8000.
Applying option f (force format) with argument rtp.
Successfully parsed a group of options.
Opening an output file: udp://127.0.0.1:33605?pkt_size=1200.
[udp @ 0x55a769cf6500] No default whitelist set
Successfully opened the file.
Parsing a group of options: output url udp://127.0.0.1:48527?pkt_size=1200.
Applying option map (set input stream mapping) with argument 0:v:0?.
Applying option vcodec (force video codec ('copy' to copy stream)) with argument copy.
Applying option f (force format) with argument rtp.
Successfully parsed a group of options.
Opening an output file: udp://127.0.0.1:48527?pkt_size=1200.
[udp @ 0x55a769d08fc0] No default whitelist set
Successfully opened the file.
Output #0, rtp, to 'udp://127.0.0.1:33605?pkt_size=1200':
  Metadata:
    encoder         : Lavf59.16.100
  Stream #0:0, 0, 1/8000: Audio: pcm_alaw, 8000 Hz, mono, s16, 64 kb/s
[rtp @ 0x55a769d06f40] dimensions not set
Could not write header for output file #1 (incorrect codec parameters ?): Invalid argument
Error initializing output stream 1:0 -- 
Stream mapping:
  Stream #0:1 -> #0:0 (copy)
  Stream #0:0 -> #1:0 (copy)
    Last message repeated 1 times
[AVIOContext @ 0x55a769d06d40] Statistics: 0 bytes written, 0 seeks, 0 writeouts
[AVIOContext @ 0x55a769d19800] Statistics: 0 bytes written, 0 seeks, 0 writeouts
[AVIOContext @ 0x55a769cd4fc0] Statistics: 88476 bytes read, 0 seeks

我使用的是FFMPEG 5.0.2,这是一个相当更新的版本。

正如您所看到的,-copy_unknown选项没有效果,因为FFMPEG在尝试识别输入时仍然会崩溃(我也尝试过在输入上指定它,但结果是一样的)。从日志中,我认为主要问题是FFMPEG没有正确解释帧速率,这阻止了它对视频进行解复用。我一直在寻找另一种方法来指定它,但找不到。

这是一个bug吗?或者可能是遗漏了什么?有人知道我如何实现目标吗?

当了解输入流的所有所需信息时,将FFMPEG用作解复用器复用器的更多相关文章

  1. canvas绘制视频封面的方法

    这篇文章主要介绍了canvas绘制视频封面的方法的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. HTML5 播放 RTSP 视频的实例代码

    目前大多数网络摄像头都是通过 RTSP 协议传输视频流的,但是 HTML 并不标准支持 RTSP 流。本文重点给大家介绍HTML5 播放 RTSP 视频的实例代码,需要的朋友参考下吧

  3. html5自定义video标签的海报与播放按钮功能

    这篇文章主要介绍了html5自定义video标签的海报与播放按钮功能,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下

  4. html5 移动端视频video的android兼容(去除播放控件、全屏)

    这篇文章主要介绍了html5 移动端视频video的android兼容,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  5. Html5 video标签视频的最佳实践

    这篇文章主要介绍了Html5 video标签视频的最佳实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  6. 使用HTML5加载音频和视频的实现代码

    这篇文章主要介绍了使用HTML5加载音频和视频的实现代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  7. HTML5 video 上传预览图片视频如何设置、预览视频某秒的海报帧

    这篇文章主要介绍了HTML5 video 上传预览图片视频如何设置、预览视频某秒的海报帧问题,需要的朋友可以参考下

  8. HTML5拍照和摄像机功能实战详解

    这篇文章主要介绍了HTML5拍照和摄像机功能实战详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  9. ios – 将视频分享到Facebook

    我正在编写一个简单的测试应用程序,用于将视频从iOS上传到Facebook.由于FacebookSDK的所有文档都在Objective-C中,因此我发现很难在线找到有关如何使用Swift执行此操作的示例/教程.到目前为止我有这个在我的UI上放置一个共享按钮,但它看起来已禁用,从我读到的这是因为没有内容设置,但我看不出这是怎么可能的.我的getVideoURL()函数返回一个NSURL,它肯定包含视

  10. ios – 在iPhone上禁用YouTube嵌入的自动全屏

    正如我们将从网站上的其他问题知道到iOSMobileSafari中我们有这些美味属性webkit-playesinline和更简洁的playinline来禁用自动全屏视频.尽管奇迹,我仍然无法弄清楚如何将其添加到YouTubehtml5嵌入.正如预期的那样,YouTube包含在中.理想的结果如下:我试图通过jquery做到这一点,徒劳无功.有任何想法或想法如何做到这一点?解决方法将playsinline=1paramerer添加到embedurl.加?或者&在适当之前;?

随机推荐

  1. 如何扩展ATmega324PB微控制器的以下宏寄存器?

    我目前正在学习嵌入式,我有以下练习:展开以下宏寄存器:如果有人解决了这个问题,我将不胜感激,以便将来参考

  2. Python将ONNX运行时设置为返回张量而不是numpy数组

    在python中,我正在加载预定义的模型:然后我加载一些数据并运行它:到目前为止,它仍在正常工作,但我希望它默认返回Tensor列表,而不是numpy数组。我对ONNX和PyTorch都是新手,我觉得这是我在这里缺少的基本内容。这将使转换中的一些开销相同。

  3. 在macOS上的终端中使用Shell查找文件中的单词

    我有一个文本文件,其中有一行:我需要找到ID并将其提取到变量中。我想出了一个RexEx模式:但它似乎对我尝试过的任何东西都不起作用:grep、sed——不管怎样。我的一个尝试是:我为这样一个看似愚蠢的问题感到抱歉,但我在互联网上找不到任何东西:我在SO和SE上读了几十个类似的问题,并在谷歌上搜索了几个教程,但仍然无法找到答案。欢迎提供任何指导!

  4. react-chartjs-2甜甜圈图中只有标题未更新

    我正在使用react-chartjs-2在我的网站中实现甜甜圈图。下面是我用来呈现图表的代码。我将甜甜圈图的详细信息从父组件传递到子组件,所有道具都正确传递。当我在beforeDraw函数外部记录props.title时,它会记录正确的值,但当我在beforeDraw函数内部记录props.title时,它将记录标题的前一个值,从而呈现标题的前值。我在这里做错了什么?

  5. 如何在tkinter中使用Python生成器函数?

    生成器函数承诺使某些代码更易于编写。但我并不总是知道如何使用它们。假设我有一个斐波那契生成器函数fib(),我想要一个显示第一个结果的tkinter应用程序。当我点击“下一步”按钮时,它会显示第二个数字,依此类推。我如何构建应用程序来实现这一点?我可能需要在线程中运行生成器。但如何将其连接回GUI?

  6. 如何为每次提交将存储库历史记录拆分为一行?

    我正在尝试获取存储库的历史记录,但结果仅以单行文本的形式返回给我。

  7. 尝试在颤振项目上初始化Firebase时出错

    当尝试在我的颤振项目上初始化firebase时,我收到了这个错误有人知道我能做什么吗?应用程序分级Gradle插件Gradle项目颤振相关性我已经将firebase设置为Google文档已经在另一个模拟器上尝试过,已经尝试过创建一个全新的模拟器,已经在不同的设备上尝试过了,已经尝试了特定版本的firebase,已经尝试添加但没有任何效果,已经在youtube上看到了关于它的每一个视频,该应用程序在android和iOS两个平台上都抛出了这个错误

  8. 在unix中基于当前日期添加新列

    我试图在unix中基于时间戳列在最后一个单元格中添加一个状态列。我不确定如何继续。

  9. 麦克斯·蒙特利。我一直得到UncaughtReferenceError:当我在终端中写入node-v时,节点未定义

    如果这是您应该知道的,请确认:我已将所有shell更改为默认为zsh。当我在终端中写入node-v时,我一直收到“UncaughtReferenceError:nodeisnotdefined”。但它显示节点已安装。我是个新手,在这方面经验不足。

  10. 如何在前端单击按钮时调用后端中的函数?

    那么如何在后端添加一个新的端点,点击按钮调用这个函数。

返回
顶部