【问题标题】:Using nginx-rtmp-module to save rtmp stream to mp4 instead of flv使用 nginx-rtmp-module 将 rtmp 流保存到 mp4 而不是 flv
【发布时间】:2022-02-06 16:41:14
【问题描述】:

我正在尝试在我的服务器上将传入的 rtmp 流保存为 mp4 文件。我正在使用nginx-rtmp 模块并将exec_record_done 指令上的容器从flv 更改为mp4。这是使用 ffmpeg 完成的,如下所示

ffmpeg -i input.flv output.mp4

我正在发送 h264 视频流和 aac 音频流(在一个 flv 容器中),以保持它与 mp4 兼容

我想知道是否可以将传入的流直接保存为mp4并避免在每个会话结束时进行转码

我猜这将有助于避免我在录制完成时看到的突然 CPU 峰值

nginx.conf

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
    worker_connections 1024;
}

rtmp {
    server {
        listen 1935;
        chunk_size 4096;
        allow publish all;
        allow play all;

        application live {
            live on;

            record all;
            record_suffix .flv;
            record_path /tmp/videos/;
            record_unique on;

            exec_record_done ffmpeg -y -i $path  /home/ubuntu/videos/$basename.mp4;
        }
    }
}

我认为这很简单,因为底层流保持不变。任何帮助表示赞赏:)

【问题讨论】:

  • MP4 不是实时流媒体格式(它作为存储文件逐步下载)。 MP4 编码器需要所有可用数据,因为 MP4 的元数据列出了所有关键帧和视频中每一帧的时间等。在这种情况下,元数据在所有数据都已知(记录完成)之前无法存在。可能的解决方案 如果它只是视频,则可以存储 H264(以及录制后的多路复用器)。如果您也有音频,那么您将需要一个 a/v 容器。如果您不喜欢 FLV 容器,可以尝试输出为 分段 MP4 格式。

标签: nginx ffmpeg mp4 rtmp flv


【解决方案1】:

这是因为你的FFmpeg命令不正确,试试这个:

exec_record_done ffmpeg -i $path -c copy /home/ubuntu/videos/$basename.mp4;

记得添加-c copy 告诉FFmpeg 将FLV 转换为MP4 而无需转码。

另一种解决方案是自己复制 HLS 文件并将 HLS 转换为 MP4。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    相关资源
    最近更新 更多