ireader / media-server

RTSP/RTP/RTMP/FLV/HLS/MPEG-TS/MPEG-PS/MPEG-DASH/MP4/fMP4/MKV/WebM
MIT License
3.05k stars 1.07k forks source link

您好,可否知道這套源碼的mepgts如何使用呢? #233

Open mjx4mois opened 2 years ago

mjx4mois commented 2 years ago

因為才剛開始研究流媒體,對TS流有興趣研究,但沒有看到相關使用mpeg-ts-enc.c 或相關muxer操作,

追您的源碼看到後面有幾個接口在mepg-muxer.c裡,也看過mepg-muxer.h的註釋,

但實際上對接有些參數不甚了解,例如pts,dts是要何時傳入什麼數值...等

但對於struct成員的初始化,跟寫資料的參數要如何設置?

假設我有H264資料跟音頻資料,frame rate...等資訊,要如何給進去packer呢?

還請您幫忙解惑,感謝您.

ireader commented 2 years ago

libmpeg/test目录下有ps/ts demuxer例子。 libflv/test目录下有flv文件与ts文件转换的例子:flv2ts-test.cpp, ts2flv-test.cpp.

flv文件时间戳单位1/1000ms, ts文件时间戳1/90000ms。

如果有裸h264文件,读取264数据并且分帧后,调用mpeg_ts_write写入数据即可。注意:必须是完整的一帧264数据。

mjx4mois commented 2 years ago

感谢您的回答,但还有小弟几个地方不了解,还请大佬多多提点

1.有看到PSI_STREAM_AAC,但如果是丢PCM资料,是否在自己新增一个 PSI_STREAM_PCM 的enum成员呢? 并在相对应地方新增写入做判断?

2.是否要照flv2ts范例一样要先建立PMT? 看flv2ts-test.cpp的example路径是这样 ts_stream()->mpeg_ts_add_stream()->mpeg_ts_pmt_add_stream()

3.如下这些定义的含意是?这些参数在mpeg-ts-enc.c

define PCR_DELAY 0 //(700 * 90) // 700ms

define PAT_PERIOD (400 * 90) // 500ms

define PAT_CYCLE 50 // 50fps(audio + video)

假设video fps设定30,这边是让PAT_CYCLE设定30没错吧? PAT_PERIOD也是要连动设定吗? PCR_DELAY主要用意是什么呢?

4.有看到初始化3个fp ,是否 ts_write为最后输出的地方呢? 看起来ts_alloc跟ts_free好像不用在实做?

還請多多幫忙了

ireader commented 2 years ago

感谢您的回答,但还有小弟几个地方不了解,还请大佬多多提点

1.有看到PSI_STREAM_AAC,但如果是丢PCM资料,是否在自己新增一个 PSI_STREAM_PCM 的enum成员呢? 并在相对应地方新增写入做判断?

mpeg-ts标准没有提到PCM,如果需要使用PCM,可以自定义一种类型,或者使用PSI_STREAM_AUDIO_G711A、PSI_STREAM_AUDIO_G711U。(这2种g711扩展标准播放器不支持)

2.是否要照flv2ts范例一样要先建立PMT? 看flv2ts-test.cpp的example路径是这样 ts_stream()->mpeg_ts_add_stream()->mpeg_ts_pmt_add_stream()

需要

3.如下这些定义的含意是?这些参数在mpeg-ts-enc.c

define PCR_DELAY 0 //(700 90) // 700ms #define PAT_PERIOD (400 90) // 500ms #define PAT_CYCLE 50 // 50fps(audio + video)

假设video fps设定30,这边是让PAT_CYCLE设定30没错吧? PAT_PERIOD也是要连动设定吗? PCR_DELAY主要用意是什么呢?

pcr相关参数,包括delay主要用于硬件设备时钟同步,pc端不管软解还是硬解,这些参数实际没有使用。

4.有看到初始化3个fp ,是否 ts_write为最后输出的地方呢? 看起来ts_alloc跟ts_free好像不用在实做?

還請多多幫忙了

alloc/free回调只是为了方便内存复用,write是最终生成ts 188字节的地方。 在write函数里可以保持成文件,也可以直接通过网络发送出去。

mjx4mois commented 2 years ago

謝謝大佬回答,

目前調試源碼,嘗試寫入多張I frame ,打印出看到pmt->stream_count=4的時候,進入mpeg_ts_pmt_add_stream 出現 assert , 估計是stream_count用完了,但看完源碼沒有看到類似設定處.

目前使用簡單 while(frame<300) / 1s =30frame / { .... mpeg_ts_write(ts, mpeg_ts_add_stream(ts, data_type, NULL, 0), MPEG_FLAG_IDR_FRAME, pts 90, dts 90, read_h264_buffer, get_h264_file_size_data); .... }

不知是否哪邊調試出問題?

還請幫忙提點一下,謝謝.

ireader commented 2 years ago

对每种音视频 mpeg_ts_add_stream 只需要调用一次

mjx4mois commented 2 years ago

目前可以將H264正常寫入了,另外想再請問您,目前塞PCM資料除了再mpeg_stream_type_audio添加字定義的PCM enum後, 已將PCM格式寫入到ts流中,但PC端的播放器確沒辦法正確解出PCM影片是靜音的(這邊有確認MPEG_FLAG_H264_H265_WITH_AUD是有設定到的.) 是否在給進去PCM資料前需要寫基本的格式資訊?例如:sample rate,單/雙通,頻率?

再次感謝您!

ireader commented 2 years ago

MPEG-TS标准不支持PCM音频格式, 这个库中的pcm音频是私有扩展,需要支持国标gb28181协议的播放器才能播放音频。

ireader commented 2 years ago

最好将pcm转换成aac,再保存到ts文件。