xiaonanko

xiaonanko

0个粉丝

33

问答

0

专栏

0

资料

xiaonanko  发布于  2016-06-15 18:46:05
采纳率 0%
33个问答
3668

TS流花屏~3516A生成的es流手工封成TS流花屏

 
本帖最后由 xiaonanko 于 2016-6-15 18:50 编辑

其中关键问题(1)PTS和DTS时间戳我采用的是海思的系统时间戳 处理后(*9/100)作为PTS,封装好的ts流帧率上和3516a设置的帧率相近
(2)PCR 由于不知道如何设置PCR,暂时没有设置PCR的值-
现象简单描述:画面部分可见,但是有大部区域纯色,斑块化严重~
现象截图如下:
我来回答
回答8个
时间排序
认可量排序

xiaonanko

0个粉丝

33

问答

0

专栏

0

资料

xiaonanko 2016-06-16 09:37:02
认可0
有人路过吗~请帮我解答一下呗~

ngswfx

2个粉丝

55

问答

1

专栏

40

资料

ngswfx 2016-06-16 09:44:23
认可0
只要花屏,通常就是流错了,这个错,应该是在TS播放器,送入解码时不符合要求。

///你现在做到什么地步了,ES流封装为TS,解码用的通用播放器,还是自己再解析?

xiaonanko

0个粉丝

33

问答

0

专栏

0

资料

xiaonanko 2016-06-16 09:46:20
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=31795&ptid=11618]ngswfx 发表于 2016-6-16 09:44[/url]
只要花屏,通常就是流错了,这个错,应该是在TS播放器,送入解码时不符合要求。

///你现在做到什么地步 ...[/quote]

现在我自己把ES流封成TS流了~但是会有花屏~主要里面的PCR参数不知道怎么添加~{:3_47:}

ngswfx

2个粉丝

55

问答

1

专栏

40

资料

ngswfx 2016-06-16 09:57:51
认可0
本帖最后由 ngswfx 于 2016-6-16 10:01 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=31796&ptid=11618]xiaonanko 发表于 2016-6-16 09:46[/url]
现在我自己把ES流封成TS流了~但是会有花屏~主要里面的PCR参数不知道怎么添加~[/quote]

这个太专业我也不懂。

上次共享的那个代码里面有PCR设置呀

static block_t *TSNew( mux_t *p_mux, ts_stream_t *p_stream,  bool_t b_pcr )
{
        block_t *p_pes = p_stream->chain_pes.p_first;
        block_t *p_ts;

        bool_t b_new_pes = 0;
        bool_t b_adaptation_field = 0;

        int i_payload_max = 184 - ( b_pcr ? 8 : 0 );
        int i_payload;

        if( p_stream->i_pes_used <= 0 )
        {
                b_new_pes = 1;
        }
        i_payload = __MIN( (int)p_pes->m_nDataSize/*i_buffer*/ - p_stream->i_pes_used,
                i_payload_max );

        if( b_pcr || i_payload < i_payload_max )
        {
                b_adaptation_field = 1;
        }

        p_ts = new block_t();
        p_ts->AllocateBuffer(188);
        p_ts->m_nDataSize = 188;//p_ts = block_New( p_mux, 188 );
        p_ts->i_dts = p_pes->i_dts;

        p_ts->m_pData/*p_buffer*/[0] = 0x47;
        p_ts->m_pData/*p_buffer*/[1] = ( b_new_pes ? 0x40 : 0x00 ) |
                ( ( p_stream->i_pid >> 8 )&0x1f );
        p_ts->m_pData/*p_buffer*/[2] = p_stream->i_pid & 0xff;
        p_ts->m_pData/*p_buffer*/[3] = ( b_adaptation_field ? 0x30 : 0x10 ) |
                p_stream->i_continuity_counter;

        p_stream->i_continuity_counter = (p_stream->i_continuity_counter+1)%16;
        p_stream->b_discontinuity = (p_pes->i_flags & BLOCK_FLAG_DISCONTINUITY);

        if( b_adaptation_field )
        {
                int i;

                if( b_pcr )
                {
                        int     i_stuffing = i_payload_max - i_payload;

                        p_ts->i_flags |= BLOCK_FLAG_CLOCK;

                        p_ts->m_pData/*p_buffer*/[4] = 7 + i_stuffing;
                        p_ts->m_pData/*p_buffer*/[5] = 0x10;   /* flags */
                        if( p_stream->b_discontinuity )
                        {
                                p_ts->m_pData/*p_buffer*/[5] |= 0x80; /* flag TS dicontinuity */
                                p_stream->b_discontinuity = false;
                        }
                        p_ts->m_pData/*p_buffer*/[6] = ( 0 )&0xff;
                        p_ts->m_pData/*p_buffer*/[7] = ( 0 )&0xff;
                        p_ts->m_pData/*p_buffer*/[8] = ( 0 )&0xff;
                        p_ts->m_pData/*p_buffer*/[9] = ( 0 )&0xff;
                        p_ts->m_pData/*p_buffer*/[10]= ( ( 0 )&0x80 ) | 0x7e;
                        p_ts->m_pData/*p_buffer*/[11]= 0;

                        for( i = 12; i < 12 + i_stuffing; i++ )
                        {
                                p_ts->m_pData/*p_buffer*/ = 0xff;
                        }
                }
                else
                {
                        int i_stuffing = i_payload_max - i_payload;

                        p_ts->m_pData/*p_buffer*/[4] = i_stuffing - 1;
                        if( i_stuffing > 1 )
                        {
                                p_ts->m_pData/*p_buffer*/[5] = 0x00;
                                for( i = 6; i < 6 + i_stuffing - 2; i++ )
                                {
                                        p_ts->m_pData/*p_buffer*/ = 0xff;
                                }
                        }
                }
        }

        /* copy payload */
        memcpy( &p_ts->m_pData/*p_buffer*/[188 - i_payload],
                &p_pes->m_pData/*p_buffer*/[p_stream->i_pes_used], i_payload );

        p_stream->i_pes_used += i_payload;
        p_stream->i_pes_dts = p_pes->i_dts + p_pes->i_length *
                p_stream->i_pes_used / p_pes->m_nDataSize/*i_buffer*/;
        p_stream->i_pes_length -= p_pes->i_length * i_payload / p_pes->m_nDataSize/*i_buffer*/;

        if( p_stream->i_pes_used >= (int)p_pes->m_nDataSize/*i_buffer*/ )
        {
                p_pes = BufferChainGet( &p_stream->chain_pes );
                delete p_pes;//block_Release( p_pes );

                p_pes = p_stream->chain_pes.p_first;
                if( p_pes )
                {
                        p_stream->i_pes_dts    = p_pes->i_dts;
                        p_stream->i_pes_length = 0;
                        while( p_pes )
                        {
                                p_stream->i_pes_length += p_pes->i_length;

                                p_pes = p_pes->p_next;
                        }
                }
                else
                {
                        p_stream->i_pes_dts = 0;
                        p_stream->i_pes_length = 0;
                }
                p_stream->i_pes_used = 0;
        }

        return p_ts;
}

static void TSSetPCR( block_t *p_ts, mtime_t i_dts )
{
        mtime_t i_pcr = 9 * i_dts / 100;

        p_ts->m_pData/*p_buffer*/[6]  = ( i_pcr >> 25 )&0xff;
        p_ts->m_pData/*p_buffer*/[7]  = ( i_pcr >> 17 )&0xff;
        p_ts->m_pData/*p_buffer*/[8]  = ( i_pcr >> 9  )&0xff;
        p_ts->m_pData/*p_buffer*/[9]  = ( i_pcr >> 1  )&0xff;
        p_ts->m_pData/*p_buffer*/[10]|= ( i_pcr << 7  )&0x80;
}

ngswfx

2个粉丝

55

问答

1

专栏

40

资料

ngswfx 2016-06-16 09:59:02
认可0
本帖最后由 ngswfx 于 2016-6-16 10:07 编辑

从PCR原理看,就是最后一个封装动作,再获取记录一次时间。

你这个matlab用来当播放器,也太浪费了吧。呵呵。你转换完成后,保存成文件,用专用的播放器测试一下。

xiaonanko

0个粉丝

33

问答

0

专栏

0

资料

xiaonanko 2016-06-16 10:01:25
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=31800&ptid=11618]ngswfx 发表于 2016-6-16 09:59[/url]
从PCR原理看,就是最后一个封装动作,再获取记录一次时间。[/quote]

谢谢了,我再看看~

yaoyaohu

0个粉丝

0

问答

0

专栏

0

资料

yaoyaohu 2017-10-10 22:20:06
认可0
av_interleaved_write_frame

yang1372073

0个粉丝

19

问答

0

专栏

2

资料

yang1372073 2017-10-12 16:06:06
认可0
注意类似PES头里面的PES_packet_length字段这种,如        ts_video_pes->PES_packet_length        = one_frame_len;  //16bits
这是个16bits的字段,帧长度bytes如果大于65535就要截断,如果直接放就认为是0,等于丢数据了
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
相关问答
无更多相似问答 去提问
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区