日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【视音频复用器】

發(fā)布時間:2023/12/29 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【视音频复用器】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
把mp3和h264合成mp4

參考雷神的文章
最簡單的基于FFmpeg的封裝格式處理:視音頻復用器(muxer)
雷神的文章是2014年的,當前的ffmpeg版本已經到5了,有的api已經過期,需要使用新的api。
當前的開發(fā)工具:vs2019
ffmpeg版本:5.1

修改的部分主要是編碼器參數的拷貝改成了調用
avcodec_parameters_copy

代碼如下:

/*** 最簡單的基于FFmpeg的視音頻復用器* Simplest FFmpeg Muxer** 雷霄驊 Lei Xiaohua* leixiaohua1020@126.com* 中國傳媒大學/數字電視技術* Communication University of China / Digital TV Technology* http://blog.csdn.net/leixiaohua1020** 本程序可以將視頻碼流和音頻碼流打包到一種封裝格式中。* 程序中將AAC編碼的音頻碼流和H.264編碼的視頻碼流打包成* MPEG2TS封裝格式的文件。* 需要注意的是本程序并不改變視音頻的編碼格式。** This software mux a video bitstream and a audio bitstream* together into a file.* In this example, it mux a H.264 bitstream (in MPEG2TS) and* a AAC bitstream file together into MP4 format file.**/#include <stdio.h>#define __STDC_CONSTANT_MACROS#ifdef _WIN32//Windows extern "C" { #include "libavformat/avformat.h" }; #else//Linux... #ifdef __cplusplus extern "C" { #endif #include <libavformat/avformat.h> #ifdef __cplusplus }; #endif #endif/* FIX: H.264 in some container format (FLV, MP4, MKV etc.) need "h264_mp4toannexb" bitstream filter (BSF)*Add SPS,PPS in front of IDR frame*Add start code ("0,0,0,1") in front of NALU H.264 in some container (MPEG2TS) don't need this BSF. */ //'1': Use H.264 Bitstream Filter #define USE_H264BSF 0/* FIX:AAC in some container format (FLV, MP4, MKV etc.) need "aac_adtstoasc" bitstream filter (BSF) */ //'1': Use AAC Bitstream Filter #define USE_AACBSF 0int main(int argc, char* argv[]) {const AVOutputFormat* ofmt = NULL;//Input AVFormatContext and Output AVFormatContextAVFormatContext* ifmt_ctx_v = NULL, * ifmt_ctx_a = NULL, * ofmt_ctx = NULL;AVPacket* pkt;int ret, i;int videoindex_v = -1, videoindex_out = -1;int audioindex_a = -1, audioindex_out = -1;int frame_index = 0;int64_t cur_pts_v = 0, cur_pts_a = 0;//const char *in_filename_v = "cuc_ieschool.ts";//Input file URLconst char* in_filename_v = "cuc_ieschool.h264";//const char *in_filename_a = "cuc_ieschool.mp3";//const char *in_filename_a = "gowest.m4a";//const char *in_filename_a = "gowest.aac";const char* in_filename_a = "cuc_ieschool.mp3";const char* out_filename = "cuc_ieschool.mp4";//Output file URL//Inputif ((ret = avformat_open_input(&ifmt_ctx_v, in_filename_v, 0, 0)) < 0) {printf("Could not open input file.");goto end;}if ((ret = avformat_find_stream_info(ifmt_ctx_v, 0)) < 0) {printf("Failed to retrieve input stream information");goto end;}if ((ret = avformat_open_input(&ifmt_ctx_a, in_filename_a, 0, 0)) < 0) {printf("Could not open input file.");goto end;}if ((ret = avformat_find_stream_info(ifmt_ctx_a, 0)) < 0) {printf("Failed to retrieve input stream information");goto end;}printf("===========Input Information==========\n");av_dump_format(ifmt_ctx_v, 0, in_filename_v, 0);av_dump_format(ifmt_ctx_a, 0, in_filename_a, 0);printf("======================================\n");//Outputavformat_alloc_output_context2(&ofmt_ctx, NULL, NULL, out_filename);if (!ofmt_ctx) {printf("Could not create output context\n");ret = AVERROR_UNKNOWN;goto end;}ofmt = ofmt_ctx->oformat;for (i = 0; i < ifmt_ctx_v->nb_streams; i++) {//Create output AVStream according to input AVStreamif (ifmt_ctx_v->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {AVStream* in_stream = ifmt_ctx_v->streams[i];AVStream* out_stream = avformat_new_stream(ofmt_ctx, NULL);videoindex_v = i;if (!out_stream) {printf("Failed allocating output stream\n");ret = AVERROR_UNKNOWN;goto end;}videoindex_out = out_stream->index;avcodec_parameters_copy(out_stream->codecpar, in_stream->codecpar);//Copy the settings of AVCodecContext//if (avcodec_copy_context(out_stream->codec, in_stream->codec) < 0) {// printf("Failed to copy context from input to output stream codec context\n");// goto end;//}//out_stream->codecpar->codec_tag = 0;//if (ofmt_ctx->oformat->flags & AVFMT_GLOBALHEADER)// out_stream->codecpar->flags |= CODEC_FLAG_GLOBAL_HEADER;break;}}for (i = 0; i < ifmt_ctx_a->nb_streams; i++) {//Create output AVStream according to input AVStreamif (ifmt_ctx_a->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {AVStream* in_stream = ifmt_ctx_a->streams[i];AVStream* out_stream = avformat_new_stream(ofmt_ctx, NULL);audioindex_a = i;if (!out_stream) {printf("Failed allocating output stream\n");ret = AVERROR_UNKNOWN;goto end;}audioindex_out = out_stream->index;avcodec_parameters_copy(out_stream->codecpar, in_stream->codecpar);//Copy the settings of AVCodecContext//if (avcodec_copy_context(out_stream->codec, in_stream->codec) < 0) {// printf("Failed to copy context from input to output stream codec context\n");// goto end;//}//out_stream->codec->codec_tag = 0;//if (ofmt_ctx->oformat->flags & AVFMT_GLOBALHEADER)// out_stream->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;break;}}printf("==========Output Information==========\n");av_dump_format(ofmt_ctx, 0, out_filename, 1);printf("======================================\n");//Open output fileif (!(ofmt->flags & AVFMT_NOFILE)) {if (avio_open(&ofmt_ctx->pb, out_filename, AVIO_FLAG_WRITE) < 0) {printf("Could not open output file '%s'", out_filename);goto end;}}//Write file headerif (avformat_write_header(ofmt_ctx, NULL) < 0) {printf("Error occurred when opening output file\n");goto end;}//FIX #if USE_H264BSFAVBitStreamFilterContext* h264bsfc = av_bitstream_filter_init("h264_mp4toannexb"); #endif #if USE_AACBSFAVBitStreamFilterContext* aacbsfc = av_bitstream_filter_init("aac_adtstoasc"); #endifpkt = av_packet_alloc();while (1) {AVFormatContext* ifmt_ctx;int stream_index = 0;AVStream* in_stream, * out_stream;//Get an AVPacketif (av_compare_ts(cur_pts_v, ifmt_ctx_v->streams[videoindex_v]->time_base, cur_pts_a, ifmt_ctx_a->streams[audioindex_a]->time_base) <= 0) {ifmt_ctx = ifmt_ctx_v;stream_index = videoindex_out;if (av_read_frame(ifmt_ctx, pkt) >= 0) {do {in_stream = ifmt_ctx->streams[pkt->stream_index];out_stream = ofmt_ctx->streams[stream_index];if (pkt->stream_index == videoindex_v) {//FIX:No PTS (Example: Raw H.264)//Simple Write PTSif (pkt->pts == AV_NOPTS_VALUE) {//Write PTSAVRational time_base1 = in_stream->time_base;//Duration between 2 frames (us)int64_t calc_duration = (double)AV_TIME_BASE / av_q2d(in_stream->r_frame_rate);//Parameterspkt->pts = (double)(frame_index * calc_duration) / (double)(av_q2d(time_base1) * AV_TIME_BASE);pkt->dts = pkt->pts;pkt->duration = (double)calc_duration / (double)(av_q2d(time_base1) * AV_TIME_BASE);frame_index++;}cur_pts_v = pkt->pts;break;}} while (av_read_frame(ifmt_ctx, pkt) >= 0);}else {break;}}else {ifmt_ctx = ifmt_ctx_a;stream_index = audioindex_out;if (av_read_frame(ifmt_ctx, pkt) >= 0) {do {in_stream = ifmt_ctx->streams[pkt->stream_index];out_stream = ofmt_ctx->streams[stream_index];if (pkt->stream_index == audioindex_a) {//FIX:No PTS//Simple Write PTSif (pkt->pts == AV_NOPTS_VALUE) {//Write PTSAVRational time_base1 = in_stream->time_base;//Duration between 2 frames (us)int64_t calc_duration = (double)AV_TIME_BASE / av_q2d(in_stream->r_frame_rate);//Parameterspkt->pts = (double)(frame_index * calc_duration) / (double)(av_q2d(time_base1) * AV_TIME_BASE);pkt->dts = pkt->pts;pkt->duration = (double)calc_duration / (double)(av_q2d(time_base1) * AV_TIME_BASE);frame_index++;}cur_pts_a = pkt->pts;break;}} while (av_read_frame(ifmt_ctx, pkt) >= 0);}else {break;}}//FIX:Bitstream Filter #if USE_H264BSFav_bitstream_filter_filter(h264bsfc, in_stream->codec, NULL, &pkt.data, &pkt.size, pkt.data, pkt.size, 0); #endif #if USE_AACBSFav_bitstream_filter_filter(aacbsfc, out_stream->codec, NULL, &pkt.data, &pkt.size, pkt.data, pkt.size, 0); #endif//Convert PTS/DTSpkt->pts = av_rescale_q_rnd(pkt->pts, in_stream->time_base, out_stream->time_base, (AVRounding)(AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX));pkt->dts = av_rescale_q_rnd(pkt->dts, in_stream->time_base, out_stream->time_base, (AVRounding)(AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX));pkt->duration = av_rescale_q(pkt->duration, in_stream->time_base, out_stream->time_base);pkt->pos = -1;pkt->stream_index = stream_index;printf("Write 1 Packet. size:%5d\tpts:%lld\n", pkt->size, pkt->pts);//Writeif (av_interleaved_write_frame(ofmt_ctx, pkt) < 0) {printf("Error muxing packet\n");break;}av_packet_unref(pkt);}av_packet_free(&pkt);//Write file trailerav_write_trailer(ofmt_ctx);#if USE_H264BSFav_bitstream_filter_close(h264bsfc); #endif #if USE_AACBSFav_bitstream_filter_close(aacbsfc); #endifend:avformat_close_input(&ifmt_ctx_v);avformat_close_input(&ifmt_ctx_a);/* close output */if (ofmt_ctx && !(ofmt->flags & AVFMT_NOFILE))avio_close(ofmt_ctx->pb);avformat_free_context(ofmt_ctx);if (ret < 0 && ret != AVERROR_EOF) {printf("Error occurred.\n");return -1;}return 0; }

總結

以上是生活随笔為你收集整理的【视音频复用器】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日韩国产精品久久 | 亚洲怡春院| 性色在线观看 | 欧美伦理影院 | 97免费在线视频 | 熟妇人妻中文字幕无码老熟妇 | 在线视频日韩欧美 | 91麻豆精品国产理伦片在线观看 | 亚洲超碰在线观看 | 午夜福利视频合集1000 | 在线观看视频99 | 精品国产乱码久久久久久蜜臀 | 日韩欧美国产一区二区 | 亚洲国产精品一区二区尤物区 | 日日弄天天弄美女bbbb | 亚洲毛片一区 | 成人免费毛片日本片视频 | 怡红院成人影院 | 成人一区av | 一级片免费视频 | 噼里啪啦国语高清 | 日韩中文字 | 黄瓜视频在线观看污 | 亚洲女人天堂网 | 一区二区美女视频 | 熟女视频一区二区三区 | 中文字幕av久久 | 黑人三级视频 | 欧美日韩一区二区三区不卡视频 | 久久精品视屏 | 日韩成人av一区二区 | 噜噜噜噜私人影院 | 亚洲精品国产电影 | 亚洲天堂中文 | 欧美成人久久久 | 精品一区中文字幕 | 在线观视频免费观看 | 国产免费一区二区三区在线播放 | 一级特黄色大片 | 精品人伦一区二区三区蜜桃网站 | av亚洲在线| 韩日一区二区 | 9l视频自拍九色9l视频 | 日本少妇高潮喷水xxxxxxx | 亚洲www在线观看 | 日本亚洲一区二区 | 欧美sese| 欧美亚洲第一页 | 亚洲精品久久久久国产 | 超碰午夜 | 国产三级三级看三级 | 久久精品无码中文字幕 | 天堂网中文 | 色a视频 | 六月丁香啪啪 | 欧美极品视频在线观看 | 国产绿帽刺激高潮对白 | a级黄片毛片 | 好吊色一区二区 | 免费人成视频在线 | 蜜桃av在线免费观看 | 丰满人妻一区二区三区性色 | 欧美一级片网址 | 日日骚av| 一区二区视频播放 | 亚洲日本在线播放 | 性视频在线 | 免看一级a毛片一片成人不卡 | 美女久久| 国产亚洲成人精品 | 一区二区精彩视频 | 中文字幕在线视频免费播放 | 五月婷婷综合久久 | 久久亚洲少妇 | 欧美黑人又粗又大高潮喷水 | 久久2019 | www日本视频 | 日韩在线免费观看视频 | 91中文字幕永久在线 | 天堂网在线看 | 欧美日韩一区二区三区在线视频 | 国产一级片网站 | www.av日韩 | 亚洲综合在线成人 | 欧美一级一级一级 | 韩国理论午夜 | 爱情岛论坛亚洲入口 | 激情偷乱人成视频在线观看 | 欧美精品二区 | 欧美大片一区二区 | 日韩草逼视频 | 午夜伦视频 | 国产精选自拍 | 日韩色网站 | 国产又粗又猛又爽又黄91精品 | 无码人妻精品一区二区三应用大全 | 性a视频| 欧美日韩欧美 | 小视频在线免费观看 |