|
ffmpeg实现h264和aac 数据mux复用为flv或ts或avi或mp4格式的封装
[复制链接]
在下面的代码中,通过ffmpeg 实现了音视频数据流的mux ,文件封装或者是网络串流,修改输出接口就可以了;
输入为一路音频aac和一路视频h264,其中test.hdr和test.adr分别为h264和aac 的一个引导序列的文件,可以通过这个文件直接获取一帧的音频或者是视频的数据,
后面的程序直接就是打包和封装了;
具体的程序,大家可以下载附件中的代码和音视频流进行测试,有问题直接在下面回帖就好;
while(1){
AVPacket pkt = { 0 };
av_init_packet(&pkt);
pkt.dts = pts_time;
pkt.pts = pts_time;
char str_buffer[1000*1024] = "";
pkt.data = (unsigned char *)str_buffer;
pkt.size = 0;
char msg[128] = "";
if(video_tag == 1)
{
pts_time += 23*90;
pkt.stream_index = video_st->index;
str_length = fgets(msg,sizeof(msg),fp_hdr);
if(str_length == NULL)
break;
pkt.size = atoi(msg);
ret = fread(pkt.data,pkt.size,1,fp_h264);
if(ret <= 0)
break;
video_tag = 0;
}else{
pkt.stream_index = audio_st->index;
str_length = fgets(msg,sizeof(msg),fp_adr);
if(str_length == NULL)
break;
pkt.size = atoi(msg);
ret = fread(pkt.data,pkt.size,1,fp_aac);
if(ret <= 0)
break;
video_tag = 1;
}
ret = av_interleaved_write_frame(oc, &pkt);
if (ret != 0) {
fprintf(stderr, "Ternence.Hsu # Error while writing video frame: %s\n", av_err2str(ret));
exit(1);
}
}
|
|
|