FFMPEG推送rtmp源实例怎么解决_百度知道ffmpeg项目专栏(2)
开源软件专栏(2)
1.ffmpeg推送rtmp流时,要求将音视频封装为flv格式,对音视频的编码格式都有要求:
关于flv还会单独开辟一篇文章进行详细分析
&1&视频支持格式如下:
{ ***_CODEC_ID_FLV1,
FLV_CODECID_H263 },
{ ***_CODEC_ID_H263,
FLV_CODECID_REALH263 },
{ ***_CODEC_ID_MPEG4,
FLV_CODECID_MPEG4 },
{ ***_CODEC_ID_FLASHSV,
FLV_CODECID_SCREEN },
{ ***_CODEC_ID_FLASHSV2, FLV_CODECID_SCREEN2 },
{ ***_CODEC_ID_VP6F,
FLV_CODECID_VP6 },
{ ***_CODEC_ID_VP6,
FLV_CODECID_VP6 },
{ ***_CODEC_ID_VP6A,
FLV_CODECID_VP6A },
{ ***_CODEC_ID_H264,
FLV_CODECID_H264 },
{ ***_CODEC_ID_NONE,
&2&音频支持格式如下:
{ ***_CODEC_ID_MP3 },
{ ***_CODEC_ID_PCM_U8},
{ ***_CODEC_ID_PCM_S16BE },
{ ***_CODEC_ID_PCM_S16LE },
{ ***_CODEC_ID_ADPCM_SWF },
{ ***_CODEC_ID_AAC},
{ ***_CODEC_ID_NELLYMOSER },
{ ***_CODEC_ID_PCM_MULAW },
{ ***_CODEC_ID_PCM_ALAW},
{ ***_CODEC_ID_SPEEX},
{ ***_CODEC_ID_NONE,
2.ffmpeg可提供flvflags选项以配置FLV头的额外数据,设置后AAC音频可支持除4, 11025以外的采样率;
原理:该问题主要是利用了aac的扩展字节来实现的;
{ "flvflags", "FLV muxer flags", offsetof(FLVContext, flags), ***_OPT_TYPE_FLAGS, {.i64 = 0}, INT_MIN, INT_MAX, ***_OPT_FLAG_ENCODING_PARAM, "flvflags" },
原代码如下:
if (!enc-&extradata_size && flv-&flags & 1) {
int samplerate_
int channels = flv-&audio_enc-&channels - (flv-&audio_enc-&channels == 8 ? 1 : 0);
uint8_t data[2];
for (samplerate_index = 0; samplerate_index & 16; samplerate_index++)
if (flv-&audio_enc-&sample_rate == mpeg4audio_sample_rates[samplerate_index])
init_put_bits(&pbc, data, sizeof(data));
put_bits(&pbc, 5, flv-&audio_enc-&profile + 1); //profile
put_bits(&pbc, 4, samplerate_index); //sample rate index
put_bits(&pbc, 4, channels);
put_bits(&pbc, 1, 0); //frame length - 1024 samples
put_bits(&pbc, 1, 0); //does not depend on core coder
put_bits(&pbc, 1, 0); //is not extension
flush_put_bits(&pbc);
avio_w8(pb, data[0]);
avio_w8(pb, data[1]);
av_log(s, ***_LOG_WARNING, "AAC sequence header: %02x %02x.\n", data[0], data[1]);
avio_write(pb, enc-&extradata, enc-&extradata_size);
flv_muxer的源码如下:
if (enc-&codec_id == ***_CODEC_ID_AAC && pkt-&size & 2 &&(***_RB16(pkt-&data) & 0xfff0) == 0xfff0) {
//音频为AAC,且存在ADTS的同步头syncword
if (!s-&streams[pkt-&stream_index]-&nb_frames) {
av_log(s, ***_LOG_ERROR, "Malformed AAC bitstream detected: "
"use the audio bitstream filter 'aac_adtstoasc' to fix it "
"('-bsf:a aac_adtstoasc' option with ffmpeg)\n");
return ***ERROR_INVALIDDATA;
av_log(s, ***_LOG_WARNING, "aac bitstream error\n");
|ADTS AAC数据格式|
|-------------------------------------------------|
ADTS_header
ADTS_header
ADTS_header
|ADTS_header adts_fixed_header数据格式|
|--syncword[12]:同步头,值固定为0xFFF,表示一个ADTS帧的开始;
|--ID[1]:MPEG版本。(0:MPEG-4,1:MPEG-2);
|--Layer[2]:always: '00'
|--protection_absent[1]
|--profile[2]:表示使用哪个级别的AAC,有些芯片只支持AAC LC 。在MPEG-2 AAC中定义了3种:0-1-Low Complexity profile(LC);2-Scalable Sampling Rate profile(SSR);3-reserved
|--sampling_frequency_index[4]:表示使用的采样率下标,通过这个下标在 Sampling Frequencies[ ]数组中查找得知采样率的值;
There are 13 supported frequencies:
0: 96000 Hz
1: 88200 Hz
2: 64000 Hz
3: 48000 Hz
4: 44100 Hz
5: 32000 Hz
6: 24000 Hz
7: 22050 Hz
8: 16000 Hz
9: 12000 Hz
10: 11025 Hz
11: 8000 Hz
12: 7350 Hz
13: Reserved
14: Reserved
15: frequency is written explictly
|--private_bit[1]
|--channel_configuration[3]: 表示声道数
0: Defined in AOT Specifc Config
1: 1 channel: front-center
2: 2 channels: front-left, front-right
3: 3 channels: front-center, front-left, front-right
4: 4 channels: front-center, front-left, front-right, back-center
5: 5 channels: front-center, front-left, front-right, back-left, back-right
6: 6 channels: front-center, front-left, front-right, back-left, back-right, LFE-channel
7: 8 channels: front-center, front-left, front-right, side-left, side-right, back-left, back-right, LFE-channel
8-15: Reserved
|--original_copy[1]
|--home[1]
|ADTS_header adts_variable_header数据格式|
|--copyright_identification_bit
|--copyright_identification_start
|--aac_frame_length: 一个ADTS帧的长度包括ADTS头和AAC原始流;
|--adts_buffer_fullness:0x7FF 说明是码率可变的码流;
|--number_of_raw_data_blocks_in_frame
4.ffmpeg关于rtmp的实现:
&1&借助第三方库librtmp(librtmp.c);
&2&自己实现的rtmp接口(rtmpproto.c)
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:769次
排名:千里之外
原创:15篇ffmpeg RTMP - 推酷
ffmpeg RTMP
1、ffmpeg 推送视频文件,音视频的编码格式只能为H264、AAC。
ffmpeg -re -i &E:\片源\复仇者联盟720p.mov& -vcodec copy -acodec copy -f flv rtmp://192.168.11.75/live/test1
ffmpeg -re -i &E:\片源\复仇者联盟720p.mov& -vcodec copy -acodec copy -f flv rtmpt://192.168.11.75:8080/live/test1
2、网络摄像机 rtsp流转推rtmp直播(不过有丢包情况,还请大家多给指点)
ffmpeg -i rtsp://ip address/original -crf 30 -preset ultrafast -acodec aac -strict experimental -ar 44100 -ac 2 -b:a 96k -vcodec libx264 -r 25 -b:v 500k -s 640*480 -f flv rtmp://ip address/live/stram
ffmpeg参数说明:
输出所有可用格式
指定格式(音频或视频格式)
-i filename
指定输入文件名,在linux下当然也能指定:0.0(屏幕录制)或摄像头
覆盖已有文件
-t duration
记录时长为t
-fs limit_size
设置文件大小上限
-ss time_off
从指定的时间(s)开始, [-]hh:mm:ss[.xxx]的格式也支持
-itsoffset time_off
设置时间偏移(s),该选项影响所有后面的输入文件。该偏移被加到输入文件的时戳,定义一个正偏移意味着相应的流被延迟了 offset秒。 [-]hh:mm:ss[.xxx]的格式也支持
-title string
-timestamp time
-author string
-copyright string
-comment string
-album string
-v verbose
与log相关的
-target type
设置目标文件类型(&vcd&, &svcd&, &dvd&, &dv&, &dv50&, &pal-vcd&, &ntsc-svcd&, ...)
-dframes number
设置要记录的帧数
指定比特率(bits/s),似乎ffmpeg是自动VBR的,指定了就大概是平均比特率
使用标准比特率
指定视频比特率(bits/s)
-vframes number
设置转换多少桢(frame)的视频
帧速率(fps) (可以改,确认非标准桢率会导致音画不同步,所以只能设定为15或者29.97)
指定分辨率 (320x240)
-aspect aspect
设置视频长宽比(4:3, 16:9 or 1.7)
-croptop size
设置顶部切除尺寸(in pixels)
-cropbottom size
设置底部切除尺寸(in pixels)
-cropleft size
设置左切除尺寸 (in pixels)
-cropright size
设置右切除尺寸 (in pixels)
-padtop size
设置顶部补齐尺寸(in pixels)
-padbottom size
底补齐(in pixels)
-padleft size
左补齐(in pixels)
-padright size
右补齐(in pixels)
-padcolor color
补齐带颜色(000000-FFFFFF)
-vcodec codec
强制使用codec编解码方式('copy' to copy stream)
使用同样视频质量作为源(VBR)
选择处理遍数(1或者2)。两遍编码非常有用。第一遍生成统计信息,第二遍生成精确的请求的码率
-passlogfile file
选择两遍的纪录文件名为file
在现在的视频流后面加入新的视频流
高级视频选项
-pix_fmt format
set pixel format, 'list' as argument shows all the pixel formats supported
仅适用帧内编码
以&数值&质量为基础的VBR,取值0.01-255,约小质量越好
-loop_input
设置输入流的循环数(目前只对图像有效)
-loop_output
设置输出视频的循环数,比如输出gif时设为0表示无限循环
设置图像组大小
-cutoff int
设置截止频率
设定最小质量,与-qmax(设定最大质量)共用,比如-qmin 10 -qmax 31
设定最大质量
-qdiff int
量化标度间最大偏差 (VBR)
使用frames B 帧,支持mpeg1,mpeg2,mpeg4
设置比特率(单位:bit/s,也许老版是kb/s)前面-ac设为立体声时要以一半比特率来设置,比如192kbps的就设成96,转换 默认比特率都较小,要听到较高品质声音的话建议设到160kbps(80)以上。
-aframes number
设置转换多少桢(frame)的音频
-aq quality
设置音频质量 (指定编码)
设置音频采样率 (单位:Hz),PSP只认24000
-ac channels
设置声道数,1就是单声道,2就是立体声,转换单声道的TVrip可以用1(节省一半容量),高品质的DVDrip就可以用2
-acodec codec
指定音频编码('copy' to copy stream)
-vol volume
设置录制音量大小(默认为256) &百分比& ,某些DVDrip的AC3轨音量极小,转换时可以用这个提高音量,比如200就是原来的2倍
在现在的音频流后面加入新的音频流
-scodec codec
设置字幕编码('copy' to copy stream)
-newsubtitle
在当前字幕后新增
-slang code
设置字幕所用的ISO 639编码(3个字母)
Audio/Video 抓取选项:
-vc channel
设置视频捕获通道(只对DV1394)
-tvstd standard
转换为flv:&& & ffmpeg -i test.mp3 -ab 56 -ar 22050 -b 500 -r 15 -s 320x240 test.flv&& & ffmpeg -i test.wmv -ab 56 -ar 22050 -b 500 -r 15 -s 320x240 test.flv&&转换文件格式的同时抓缩微图:&& & ffmpeg -i &test.avi& -y -f image2 -ss 8 -t 0.001 -s 350x240 'test.jpg'&&&对已有flv抓图:&& & ffmpeg -i &test.flv& -y -f image2 -ss 8 -t 0.001 -s 350x240 'test.jpg'&&&转换为3gp:& & ffmpeg -y -i test.mpeg -bitexact -vcodec h263 -b 128 -r 15 -s 176x144 -acodec aac -ac 2 -ar 22500 -ab 24 -f 3gp test.3gp&& & ffmpeg -y -i test.mpeg -ac 1 -acodec amr_nb -ar 8000 -s 176x144 -b 128 -r 15 test.3gp&
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致FFMPEG录制RTMP的问题
[问题点数:30分]
FFMPEG录制RTMP的问题
[问题点数:30分]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。搞了一个晚上没结果,来救助 -- ffmpeg 向srs推流rtmp
[问题点数:50分,结帖人sharkka]
搞了一个晚上没结果,来救助 -- ffmpeg 向srs推流rtmp
[问题点数:50分,结帖人sharkka]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2011年11月 专题开发/技术/项目大版内专家分月排行榜第二2011年8月 专题开发/技术/项目大版内专家分月排行榜第二
2012年4月 专题开发/技术/项目大版内专家分月排行榜第二2012年3月 专题开发/技术/项目大版内专家分月排行榜第二
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。