Closed jjksam closed 6 years ago
做flv编码的时候,用本地文件测试的,确实需要script tag,否则输出的flv本地文件无法播放。 但是推流的时候使用 crtmpserver和nginx-rtmp测试,发现传不传这个无所谓,就把它去掉了。 但是编码函数还在的。 aw_encode_flv.c -> aw_write_script_tag_body(...)
最近忙于工作,可能没有时间看这个。如有兴趣可以研究一下具体细节,分享学习一下。
rtmp流无需传递metadata即可播放。
发送 @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); } `
标准的FLV视频还需要设置一个MetaData。在发送sequential header之前可以进行发送,似乎不设置这个,普通的flv播放器会播放不了。