fox-cool

fox-cool

0个粉丝

9

问答

0

专栏

0

资料

fox-cool  发布于  2017-01-04 20:39:41
采纳率 0%
9个问答
7917

ffmpeg 打包 ts流

   
[code]#include
#include
#include
#include

#ifdef __cplusplus
extern "C"{
#endif

#include "libavformat/avformat.h"
#include "libavcodec/avcodec.h"
#include "libavutil/avutil.h"
#include "libavutil/rational.h"
#include "libavdevice/avdevice.h"
#include "libavutil/mathematics.h"
#include "libswscale/swscale.h"

#ifdef __cplusplus
}
#endif //__cplusplus


static AVStream* add_output_stream(AVFormatContext* output_format_context, AVStream* input_stream)
{
        AVCodecContext* input_codec_context = NULL;
        AVCodecContext* output_codec_context = NULL;
        
        AVStream* output_stream = NULL;
        output_stream = av_new_stream(output_format_context, 0);
        if (!output_stream)
        {
                printf("Call av_new_stream function failed\n");
                return NULL;
        }

        input_codec_context = input_stream->codec;
        output_codec_context = output_stream->codec;

        output_codec_context->codec_id = input_codec_context->codec_id;
        output_codec_context->codec_type = input_codec_context->codec_type;
        output_codec_context->codec_tag = input_codec_context->codec_tag;
        output_codec_context->bit_rate = input_codec_context->bit_rate;
        output_codec_context->extradata = input_codec_context->extradata;
        output_codec_context->extradata_size = input_codec_context->extradata_size;

        if (av_q2d(input_codec_context->time_base) * input_codec_context->ticks_per_frame > av_q2d(input_stream->time_base) && av_q2d(input_stream->time_base) < 1.0 / 1000)
        {
                output_codec_context->time_base = input_codec_context->time_base;
                output_codec_context->time_base.num *= input_codec_context->ticks_per_frame;
        }
        else
        {
                output_codec_context->time_base = input_stream->time_base;
        }
        switch (input_codec_context->codec_type)
        {
        case AVMEDIA_TYPE_AUDIO:
                output_codec_context->channel_layout = input_codec_context->channel_layout;
                output_codec_context->sample_rate = input_codec_context->sample_rate;
                output_codec_context->channels = input_codec_context->channels;
                output_codec_context->frame_size = input_codec_context->frame_size;
                if ((input_codec_context->block_align == 1 && input_codec_context->codec_id == CODEC_ID_MP3) || input_codec_context->codec_id == CODEC_ID_AC3)
                {
                        output_codec_context->block_align = 0;
                }
                else
                {
                        output_codec_context->block_align = input_codec_context->block_align;
                }
                break;
        case AVMEDIA_TYPE_VIDEO:
                output_codec_context->pix_fmt = input_codec_context->pix_fmt;
                output_codec_context->width = input_codec_context->width;
                output_codec_context->height = input_codec_context->height;
                output_codec_context->has_b_frames = input_codec_context->has_b_frames;
                if (output_format_context->oformat->flags & AVFMT_GLOBALHEADER)
                {
                        output_codec_context->flags |= CODEC_FLAG_GLOBAL_HEADER;
                }
                break;
        default:
                break;
        }

        return output_stream;
}

int main(int argc, char* argv[])
{

        const char* input = "2M_es.h264";
        const char* output_prefix = NULL;
        char* segment_duration_check = 0;
        const char* index = NULL;
        char* tmp_index = NULL;
        const char* http_prefix = NULL;
        double prev_segment_time = 0;
        double segment_duration = 0;
        
        AVInputFormat* ifmt = NULL;
        AVOutputFormat* ofmt = NULL;
        AVFormatContext* ic = NULL;
        AVFormatContext* oc = NULL;
        AVStream* video_st = NULL;
        AVStream* audio_st = NULL;
        AVCodec* codec = NULL;
        AVDictionary* pAVDictionary = NULL;

        av_register_all();

        char szError[256] = {0};
        int nRet = avformat_open_input(&ic, input, ifmt, &pAVDictionary);
        if (nRet != 0)
        {
                av_strerror(nRet, szError, 256);
                printf(szError);
                printf("\n");
                printf("Call avformat_open_input function failed!\n");
                return 0;
        }

        if (av_find_stream_info(ic) < 0)
        {
                printf("Call av_find_stream_info function failed!\n");
                return 0;
        }

        ofmt = av_guess_format("mpegts", NULL, NULL);
        if (!ofmt)
        {
                printf("Call av_guess_format function failed!\n");
                return 0;
        }

        oc = avformat_alloc_context();
        if (!oc)
        {
                printf("Call av_guess_format function failed!\n");
                return 0;
        }
        oc->oformat = ofmt;
        
        int video_index = -1, audio_index = -1;
unsigned int i=0;
        for (i = 0; i < ic->nb_streams && (video_index < 0 || audio_index < 0); i++)
        {
                switch (ic->streams->codec->codec_type)
                {
                case AVMEDIA_TYPE_VIDEO:
                        video_index = i;
                        ic->streams->discard = AVDISCARD_NONE;
                        video_st = add_output_stream(oc, ic->streams);
                        break;
                case AVMEDIA_TYPE_AUDIO:
                        audio_index = i;
                        ic->streams->discard = AVDISCARD_NONE;
                        audio_st = add_output_stream(oc, ic->streams);
                        break;
                default:
                        ic->streams->discard = AVDISCARD_ALL;
                        break;
                }
        }
        codec = avcodec_find_decoder(video_st->codec->codec_id);
        if (codec == NULL)
        {
                printf("Call avcodec_find_decoder function failed!\n");
                return 0;
        }

        if (avcodec_open(video_st->codec, codec) < 0)
        {
                printf("Call avcodec_open function failed !\n");
                return 0;
        }

        if (avio_open(&oc->pb, "/home/lucky/Desktop/264.ts", AVIO_FLAG_WRITE) < 0)
        {
                return 0;
        }

        if (avformat_write_header(oc, &pAVDictionary))
        {
                printf("Call avformat_write_header function failed.\n");
                return 0;
        }

        uint8_t *dummy = NULL;  
        int dummy_size = 0;  
        AVBitStreamFilterContext* bsfc =  av_bitstream_filter_init("h264_mp4toannexb");  
        if(bsfc == NULL)  
        {  
           return -1;  
        }   

        int decode_done = 0;
        do
        {
                double segment_time = 0;
                AVPacket packet;
                decode_done = av_read_frame(ic, &packet);
                if (decode_done < 0)
                        break;
                        
                if (av_dup_packet(&packet) < 0)
                {
                        printf("Call av_dup_packet function failed\n");
                        av_free_packet(&packet);
                        break;
                }

                static int nCount = 0;
                if (nCount++ < 20)
                {
                        printf("The packet.stream_index is %ld\n", packet.stream_index);
                }

                if (packet.stream_index == video_index && (packet.flags & AV_PKT_FLAG_KEY))
                {
            segment_time = (double)video_st->pts.val * video_st->time_base.num / video_st->time_base.den;
        }
        else if (packet.stream_index == audio_index) {
            segment_time = (double)audio_st->pts.val * audio_st->time_base.num / audio_st->time_base.den;
        }
        else {
            segment_time = prev_segment_time;
        }
                nRet = av_interleaved_write_frame(oc, &packet);
                if (nRet < 0)
                {
                        printf("Call av_interleaved_write_frame function failed\n");
                }
                else if (nRet > 0)
                {
                        printf("End of stream requested\n");
                        av_free_packet(&packet);
                        break;
                }
                av_free_packet(&packet);
        }while(!decode_done);

        av_write_trailer(oc);

        av_bitstream_filter_close(bsfc);  
        avcodec_close(video_st->codec);
unsigned int k=0;
        for(k = 0; k < oc->nb_streams; k++)
        {
                av_freep(&oc->streams[k]->codec);
                av_freep(&oc->streams[k]);
        }
        av_free(oc);
        getchar();
        return 0;
}
[/code]
我来回答
回答20个
时间排序
认可量排序

一天睡三次

0个粉丝

3

问答

0

专栏

0

资料

一天睡三次 2017-01-10 10:58:59
认可0
正在学习ffmpeg和live555,可是完全没有方向。

qqq306922360

0个粉丝

16

问答

0

专栏

0

资料

qqq306922360 2017-02-20 09:35:51
认可0
楼主有没有把以上代码改成实时流的H264接受?用ffmpeg里面的效率怎么样?

lovelypp

0个粉丝

0

问答

0

专栏

0

资料

lovelypp 2017-03-27 11:16:31
认可0
这个代码有什么用?打包成ts流的作用是什么?哪位大神解释一下啊

tomeker

0个粉丝

0

问答

0

专栏

0

资料

tomeker 2017-04-06 17:29:27
认可0
有将实时流打包成TS流的例子吗?

桃花岛主

0个粉丝

0

问答

0

专栏

0

资料

桃花岛主 2017-04-06 21:09:51
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=47253&ptid=13871]lovelypp 发表于 2017-3-27 11:16[/url]
这个代码有什么用?打包成ts流的作用是什么?哪位大神解释一下啊[/quote]

我也这个问题。

rogerlzf

0个粉丝

2

问答

0

专栏

0

资料

rogerlzf 2017-04-21 16:22:26
认可0
写的不错:)

stupid

0个粉丝

4

问答

0

专栏

0

资料

stupid 2017-04-25 09:58:41
认可0
不错不错, 学习学习!

钓鱼大师

0个粉丝

1

问答

0

专栏

0

资料

钓鱼大师 2017-06-05 14:26:12
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=43962&ptid=13871]一天睡三次 发表于 2017-1-10 10:58[/url]
正在学习ffmpeg和live555,可是完全没有方向。[/quote]

你是自学还是跟项目?自学的话确实会没有方向,一起做项目才学得快。

Chenw_Fly

0个粉丝

2

问答

0

专栏

0

资料

Chenw_Fly 2017-06-23 19:13:24
认可0
参照ffmpeg的muxing.c

fayfive

0个粉丝

13

问答

0

专栏

0

资料

fayfive 2017-09-19 15:35:24
认可0
有将实时流打包成TS流的例子吗?

hero

0个粉丝

1

问答

0

专栏

0

资料

hero 2017-09-19 16:37:20
认可0
不错不错, 学习学习!

yaoyaohu

0个粉丝

0

问答

0

专栏

0

资料

yaoyaohu 2017-09-28 18:45:20
认可0
学习中,正在找这方面的资料

wangzhy

0个粉丝

0

问答

0

专栏

0

资料

wangzhy 2017-09-29 14:18:52
认可0
学习学习,谢谢分享!

yaoyaohu

0个粉丝

0

问答

0

专栏

0

资料

yaoyaohu 2017-10-10 22:07:04
认可0
不错,可以参考下

fengzheng822

0个粉丝

5

问答

0

专栏

0

资料

fengzheng822 2017-11-16 16:49:05
认可0
不错,可以参考下

dsw2012218

0个粉丝

8

问答

0

专栏

0

资料

dsw2012218 2017-11-19 12:26:41
认可0
不错不错, 学习学习!

mom

0个粉丝

4

问答

0

专栏

0

资料

mom 2018-08-21 17:20:54
认可0
参考学习啦

pvp

0个粉丝

4

问答

0

专栏

0

资料

pvp 2018-08-25 09:13:25
认可0
可以做参考,感谢楼主分享

fpnbt

0个粉丝

6

问答

0

专栏

0

资料

fpnbt 2018-08-25 11:10:45
认可0
66666666666

hero

0个粉丝

1

问答

0

专栏

0

资料

hero 2017-11-20 08:33:04
认可0
:victory::victory::victory::victory:
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

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

Markdown 语法

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

举报类型

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

详细说明

易百纳技术社区