关于使用ffmpeg把rtsp转rtmp过程中丢包问题

关于使用ffmpeg编码丢包问题

平时在本地电脑window上时,丢包情况没怎么出现,到了Linux上的测试环境时就出现很大的丢包数,导致画面也是有很多花屏,严重时会导致转码停止。
原先的转码的ffmpeg命令如下

ffmpeg -i rtsp://192.168.1.108:554/DN0008.sdp -vcodec copy -acodec copy -f flv -y rtmp://192.168.1.108:1935/mylive/DN0008

在ffmpeg命令行中加入-preset ultrafast
该指令表示最快速编码
修改后命令

ffmpeg -i rtsp://192.168.1.108:554/DN0008.sdp -vcodec libx264 -preset ultrafast -acodec aac -f flv rtmp://192.168.1.108:1935/mylive/DN0008

相关指令

·  -preset ultrafast:最快的编码方式
·  -preset superfast:超级快速的编码方式
·  -preset veryfast:非常快速的编码方式
·  -preset faster:稍微快速的编码方式
·  -preset fast:快速的编码方式
·  -preset medium:折中的编码方式
·  -preset slow:慢的编码方式
·  -preset slower:更慢的编码方式
·  -preset veryslow:非常慢的编码方式
·  -preset placebo:最慢的编码方式

如果转码过程中出现这个错误
The encoder ‘aac’ is experimental but experimental codecs are not enabled, add ‘-strict -2’ if you want to use it.
这个错误在本地时也没出现,但是在Linux上却出现了
则在原先ffmpeg命令行中加入 -strict -2
加入后完整的命令

ffmpeg -i rtsp://192.168.1.108:554/DN0008.sdp -vcodec libx264 -preset ultrafast -acodec aac -f flv -strict -2 rtmp://192.168.1.108:1935/mylive/DN0008

相关命令的解释
-acodec aac 指定音频使用 aac 编码 -vcodec h264 指定视频使用 h264 编码
转换视频格式
ffmpeng -i source.mp4 -c:v libx264 -crf 24 destination.flv
-crf 是控制转码后视频的质量,质量越高,文件也就越大,范围是 0 到 51。0 表示高清无损;23 是默认值,51最小。建议的值范围是 18 到 28。而值 18 是视觉上看起来无损或接近无损的。
ffmpeg -i 视频源地址 -vf scale=853:480 -acodec aac -vcodec h264 视频输出地址(如:out.mp4),scale 表示缩放。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然可以!以下是一个简单的示例代码,用于将RTSP发到RTMP服务器: ```cpp #include <iostream> #include <cstdlib> #include <cstring> #include <unistd.h> #include <libavformat/avformat.h> #include <libavutil/opt.h> int main(int argc, char* argv[]) { // 注册所有的FFmpeg组件 av_register_all(); // 创建输入上下文 AVFormatContext* inputContext = avformat_alloc_context(); // 打开RTSP if (avformat_open_input(&inputContext, "rtsp://your_rtsp_url", nullptr, nullptr) != 0) { std::cerr << "无法打开RTSP" << std::endl; return -1; } // 查找信息 if (avformat_find_stream_info(inputContext, nullptr) < 0) { std::cerr << "无法获取信息" << std::endl; return -1; } // 创建输出上下文 AVFormatContext* outputContext = avformat_alloc_context(); // 设置输出格式为RTMP AVOutputFormat* outputFormat = av_guess_format("flv", nullptr, nullptr); outputContext->oformat = outputFormat; // 打开输出URL if (avio_open(&outputContext->pb, "rtmp://your_rtmp_url", AVIO_FLAG_WRITE) < 0) { std::cerr << "无法打开RTMP URL" << std::endl; return -1; } // 遍历输入 for (unsigned int i = 0; i < inputContext->nb_streams; i++) { AVStream* inputStream = inputContext->streams[i]; AVStream* outputStream = avformat_new_stream(outputContext, inputStream->codec->codec); // 复制参数 if (avcodec_copy_context(outputStream->codec, inputStream->codec) < 0) { std::cerr << "无法复制参数" << std::endl; return -1; } outputStream->codec->codec_tag = 0; if (outputContext->oformat->flags & AVFMT_GLOBALHEADER) { outputStream->codec->flags |= AV_CODEC_FLAG_GLOBAL_HEADER; } } // 写入输出头部 if (avformat_write_header(outputContext, nullptr) < 0) { std::cerr << "无法写入输出头部" << std::endl; return -1; } // 数据 AVPacket packet; while (av_read_frame(inputContext, &packet) >= 0) { AVStream* inputStream = inputContext->streams[packet.stream_index]; AVStream* outputStream = outputContext->streams[packet.stream_index]; // 设置时间基 av_packet_rescale_ts(&packet, inputStream->time_base, outputStream->time_base); packet.pos = -1; // 写入输出 if (av_interleaved_write_frame(outputContext, &packet) < 0) { std::cerr << "无法写入输出" << std::endl; break; } av_packet_unref(&packet); } // 写入输出尾部 av_write_trailer(outputContext); // 清理资源 avformat_close_input(&inputContext); avio_close(outputContext->pb); avformat_free_context(outputContext); return 0; } ``` 请注意,这只是一个简单的示例代码,用于演示如何使用FFmpegRTSP发到RTMP服务器。你需要根据自己的需求进行适当的修改和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值