hardman / AWLive

最简单的iOS 推流代码,视频捕获,软编码(faac,x264),硬编码(aac,h264),横屏直播,美颜,flv编码,rtmp协议,blog内陆续更新代码解析,你想学的知识这里都有,愿意懂直播技术的同学快来看!!
Apache License 2.0
696 stars 194 forks source link

@setDataFrame missing #8

Closed jjksam closed 6 years ago

jjksam commented 7 years ago

标准的FLV视频还需要设置一个MetaData。在发送sequential header之前可以进行发送,似乎不设置这个,普通的flv播放器会播放不了。

hardman commented 7 years ago

做flv编码的时候,用本地文件测试的,确实需要script tag,否则输出的flv本地文件无法播放。 但是推流的时候使用 crtmpserver和nginx-rtmp测试,发现传不传这个无所谓,就把它去掉了。 但是编码函数还在的。 aw_encode_flv.c -> aw_write_script_tag_body(...)

最近忙于工作,可能没有时间看这个。如有兴趣可以研究一下具体细节,分享学习一下。

hardman commented 6 years ago

rtmp流无需传递metadata即可播放。

lichaoqun commented 4 years ago

发送 @setDataFrame 可以在不解码 sps 和 pps 的情况下知道视频的分辨率, 有些 app 需要根据分辨率区分使用横屏还是竖屏的播放器(斗鱼的颜值和游戏主播), 这种情况下, 有@setDataFrame 还是很有帮助的. ------ 下边是我添加@setDataFrame的实现----- ` // - aw_streamer.c 中添加实现, 同时在 aw_streamer.h 也需要添加声明 extern void aw_streamer_send_setDataFrame_tag(aw_flv_script_tag *script_tag){ if (!aw_streamer_is_rtmp_valid()) { aw_log("[E] aw_streamer_send_setDataFrame_tag s_rtmp_ctx is NULL"); free_aw_flv_script_tag(&script_tag); return; } aw_streamer_send_flv_tag_to_rtmp(&script_tag->common_tag); }

// - 在 AWAVConfitg.m 中添加实现 ,同时在 AWAVConfitg.h 中添加声明 extern aw_flv_script_tag createScriptTagWithConfig(AWVideoConfig videoConfig, AWAudioConfig audioConfig){ aw_flv_script_tag script_tag = alloc_aw_flv_script_tag(); script_tag->duration = 0; script_tag->width = videoConfig.width; script_tag->height = videoConfig.height; script_tag->video_data_rate = videoConfig.bitrate; script_tag->frame_rate = videoConfig.fps; script_tag->a_sample_rate = audioConfig.sampleRate; script_tag->a_sample_size = audioConfig.sampleSize; script_tag->stereo = 0; script_tag->file_size = 0; return script_tag; }

// - 在 sendSpsPpsAndAudioSpecificConfigTagToSendQueue 中添加调用 aw_flv_script_tag *setDataFrameTag = createScriptTagWithConfig(self.videoConfig, self.audioConfig); if (setDataFrameTag) { aw_streamer_send_setDataFrame_tag(setDataFrameTag); } `