FFmpeg封装格式处理2-解复用例程
本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10506642.html
FFmpeg封装格式处理相关内容分为如下几篇文章:
[1]. FFmpeg封装格式处理-简介
[2]. FFmpeg封装格式处理-解复用例程
[3]. FFmpeg封装格式处理-复用例程
[4]. FFmpeg封装格式处理-转封装例程
3. 解复用例程
解复用(demux),表示从一路输入中分离出多路流(视频、音频、字幕等)。
本例实现,将输入文件中的视频流和音频流分离出来,保存为单独的文件,所保存的文件是不含封装格式的裸流文件。

3.1 源码
源码很短,用于演示demux的用法。源码中大部分函数返回值的判断均已省略。
#include <libavformat/avformat.h>
int main (int argc, char **argv)
{
if (argc != 4)
{
fprintf(stderr, "usage: %s test.ts test.h264 test.aac\n", argv[0]);
exit(1);
}
const char *input_fname = argv[1];
const char *output_v_fname = argv[2];
const char *output_a_fname = argv[3];
FILE *video_dst_file = fopen(output_v_fname, "wb");
FILE *audio_dst_file = fopen(output_a_fname, "wb");
AVFormatContext *fmt_ctx = NULL;
int ret = avformat_open_input(&fmt_ctx, input_fname, NULL, NULL);
ret = avformat_find_stream_info(fmt_ctx, NULL);
int video_idx = av_find_best_stream(fmt_ctx, AVMEDIA_TYPE_VIDEO, -1, -1, NULL, 0);
int audio_idx = av_find_best_stream(fmt_ctx, AVMEDIA_TYPE_AUDIO, -1, -1, NULL, 0);
if (video_idx < 0 || audio_idx < 0)
{
printf("find stream failed: %d %d\n", video_idx, audio_idx);
return -1;
}
av_dump_format(fmt_ctx, 0, input_fname, 0);
AVPacket pkt;
av_init_packet(&pkt);
pkt.data = NULL;
pkt.size = 0;
while (av_read_frame(fmt_ctx, &pkt) >= 0)
{
if (pkt.stream_index == video_idx)
{
ret = fwrite(pkt.data, 1, pkt.size, video_dst_file);
//printf("vp %x %3"PRId64" %3"PRId64" (size=%5d)\n", pkt.pos, pkt.pts, pkt.dts, ret);
}
else if (pkt.stream_index == audio_idx) {
ret = fwrite(pkt.data, 1, pkt.size, audio_dst_file);
//printf("ap %x %3"PRId64" %3"PRId64" (size=%5d)\n", pkt.pos, pkt.pts, pkt.dts, ret);
}
av_packet_unref(&pkt);
}
printf("Demuxing succeeded.\n");
end:
avformat_close_input(&fmt_ctx);
fclose(video_dst_file);
fclose(audio_dst_file);
return 0;
}
3.2 编译
源文件为demuxing.c,在SHELL中执行如下编译命令:
gcc -o demuxing demuxing.c -lavformat -lavcodec -g
生成可执行文件demuxing
3.3 验证
测试文件下载:tnshih.flv

先看一下测试用资源文件的格式:
think@opensuse> ffprobe tnshih.flv
ffprobe version 4.1 Copyright (c) 2007-2018 the FFmpeg developers
Input #0, flv, from 'tnshih.flv':
Metadata:
encoder : Lavf58.20.100
Duration: 00:00:37.20, start: 0.000000, bitrate: 1182 kb/s
Stream #0:0: Video: h264 (High), yuv420p(progressive), 800x450, 25 fps, 25 tbr, 1k tbn, 50 tbc
Stream #0:1: Audio: aac (LC), 44100 Hz, stereo, fltp
可以看到视频文件'tnshih.flv'封装格式为flv,包含一路h264编码的视频流和一路aac编码的音频流。
运行如下命令进行测试:
./demuxing tnshih.flv tnshih_flv.h264 tnshih_flv.aac
使用ffplay播放视频文件thshih_flv.h264及音频文件tnshih_flv.aac,均无法播放。使用ffprobe检测发现这两个文件异常。
原因参考雷霄骅博士的文章:
“使用FFMPEG类库分离出多媒体文件中的H.264码流”
“最简单的基于FFmpeg的封装格式处理:视音频分离器简化版”
本节代码仅关注最简单的解复用功能,FLV、MP4等特定容器中分离出来的h264视频流和aac音频流无法播放。
那换一种封装格式测一下,利用FFmpeg转码命令将flv封装格式转换为mpegts封装格式:
测试:
ffmpeg -i tnshih.flv -map 0 -c copy tnshih.ts
运行如下命令进行测试:
./demuxing tnshih.ts tnshih_ts.h264 tnshih_ts.aac
使用ffplay播放视频文件thshih_ts.h264及音频文件tnshih_ts.aac,播放正常。使用ffprobe检测发现这两个文件正常。
FFmpeg封装格式处理2-解复用例程的更多相关文章
- FFmpeg封装格式处理4-转封装例程
本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10506662.html FFmpeg封装格式处理相关内容分为如下几篇文章: [1]. F ...
- FFmpeg封装格式处理3-复用例程
本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10506653.html FFmpeg封装格式处理相关内容分为如下几篇文章: [1]. F ...
- FFmpeg封装格式处理
本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10506636.html FFmpeg封装格式处理相关内容分为如下几篇文章: [1]. F ...
- 音视频处理之FFmpeg封装格式20180510
一.FFMPEG的封装格式转换器(无编解码) 1.封装格式转换 所谓的封装格式转换,就是在AVI,FLV,MKV,MP4这些格式之间转换(对应.avi,.flv,.mkv,.mp4文件). 需要注意的 ...
- 最简单的基于FFmpeg的封装格式处理:视音频复用器(muxer)
===================================================== 最简单的基于FFmpeg的封装格式处理系列文章列表: 最简单的基于FFmpeg的封装格式处理 ...
- 最简单的基于FFmpeg的封装格式处理:视音频分离器(demuxer)
===================================================== 最简单的基于FFmpeg的封装格式处理系列文章列表: 最简单的基于FFmpeg的封装格式处理 ...
- 最简单的基于FFmpeg的封装格式处理:视音频分离器简化版(demuxer-simple)
===================================================== 最简单的基于FFmpeg的封装格式处理系列文章列表: 最简单的基于FFmpeg的封装格式处理 ...
- (转)【多媒体封装格式详解】--- AAC ADTS格式分析
出自:http://blog.csdn.net/tx3344/article/details/7414543 http://www.it6655.com/2012/08/aac-adts-html ...
- FLV视频封装格式详解
FLV视频封装格式详解 分类: FFMpeg编解码 2012-04-04 21:13 1378人阅读 评论(2) 收藏 举报 flvheaderaudiovideocodecfile 目录(?)[-] ...
随机推荐
- AutoCAD开发1---获取块属性
Private Sub CommandButton1_Click() Dim pEntity As AcadObject Dim pBlock As AcadBlockReference Dim pP ...
- Spring遇到的问题合集
2018-09-15 元素 "tx:annotation-driven" 的前缀 "tx" 未绑定. 后来我加了 http://www.springframew ...
- Linux学习笔记:Tomcat安装与使用
Tomcat是一个Servlet容器服务器,用java实现的. 目录结构 Tomcat的安装也很简单,从官网下载安装包.解压后的tomcat目录 apache-tomcat-7.0.92 下的子目录为 ...
- 腾讯云的基本配置(centos 7.1)及mysql的使用
因为想在微信上开发些东西,所以租用了一个月的腾讯云. 推荐选择的镜像是centos7.1.这个系统的选择和本地操作系统基本没有关系. 首先要登录到云主机中,用户名是root,密码是当初自己设置的那一个 ...
- Python(四) 列表元组
- MVC 5使用TempData Object跨视图传递数据
经过一系列显示数据的练习:<MVC 5使用ViewData(对象)显示数据>http://www.cnblogs.com/insus/p/3377178.html<MVC 5使用Vi ...
- [SRC初探]手持新手卡挖SRC逻辑漏洞心得分享
文章来源i春秋 本文适合新手参阅,大牛笑笑就好了,嘿嘿末尾有彩蛋!!!!!!!!!!!!!!!!!本人参加了本次"i春秋部落守卫者联盟"活动,由于经验不足,首次挖SRC,排名不是那 ...
- Android核心技术Intent和数据存储篇
女孩:上海站到了? 男孩:嗯呢?走向世界~ 女孩:Intent核心技术和数据存储技术? 男孩:对,今日就讲这个~ Intent是各个组件之间用来进行通信的,Intent的翻译为"意图&quo ...
- [Swift]LaunchScreen.storyboard如何跳转到到Main.storyboard
在加载App时,首先读取[LaunchScreen.storyboard]中的内容, 在App加载到内存之后,自动读取[Main.storyboard]中的初始视图控制器, 用于替换原来的[Launc ...
- 报警系统:php输出头信息以方便脚本抓取信息[排查篇]
做监控系统时,需要对某个页面进行监控,可以通过很多方式进行报警,如:正常则输出一个规定的变量,错误时则不输出.但是还有一个更为方便的做法,就是当前错误时,直接使用header抛出信息,如: heade ...