本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10506642.html

FFmpeg封装格式处理相关内容分为如下几篇文章:

[1]. FFmpeg封装格式处理-简介

[2]. FFmpeg封装格式处理-解复用例程

[3]. FFmpeg封装格式处理-复用例程

[4]. FFmpeg封装格式处理-转封装例程

3. 解复用例程

解复用(demux),表示从一路输入中分离出多路流(视频、音频、字幕等)。

本例实现,将输入文件中的视频流和音频流分离出来,保存为单独的文件,所保存的文件是不含封装格式的裸流文件。

3.1 源码

源码很短,用于演示demux的用法。源码中大部分函数返回值的判断均已省略。

  1. #include <libavformat/avformat.h>
  2. int main (int argc, char **argv)
  3. {
  4. if (argc != 4)
  5. {
  6. fprintf(stderr, "usage: %s test.ts test.h264 test.aac\n", argv[0]);
  7. exit(1);
  8. }
  9. const char *input_fname = argv[1];
  10. const char *output_v_fname = argv[2];
  11. const char *output_a_fname = argv[3];
  12. FILE *video_dst_file = fopen(output_v_fname, "wb");
  13. FILE *audio_dst_file = fopen(output_a_fname, "wb");
  14. AVFormatContext *fmt_ctx = NULL;
  15. int ret = avformat_open_input(&fmt_ctx, input_fname, NULL, NULL);
  16. ret = avformat_find_stream_info(fmt_ctx, NULL);
  17. int video_idx = av_find_best_stream(fmt_ctx, AVMEDIA_TYPE_VIDEO, -1, -1, NULL, 0);
  18. int audio_idx = av_find_best_stream(fmt_ctx, AVMEDIA_TYPE_AUDIO, -1, -1, NULL, 0);
  19. if (video_idx < 0 || audio_idx < 0)
  20. {
  21. printf("find stream failed: %d %d\n", video_idx, audio_idx);
  22. return -1;
  23. }
  24. av_dump_format(fmt_ctx, 0, input_fname, 0);
  25. AVPacket pkt;
  26. av_init_packet(&pkt);
  27. pkt.data = NULL;
  28. pkt.size = 0;
  29. while (av_read_frame(fmt_ctx, &pkt) >= 0)
  30. {
  31. if (pkt.stream_index == video_idx)
  32. {
  33. ret = fwrite(pkt.data, 1, pkt.size, video_dst_file);
  34. //printf("vp %x %3"PRId64" %3"PRId64" (size=%5d)\n", pkt.pos, pkt.pts, pkt.dts, ret);
  35. }
  36. else if (pkt.stream_index == audio_idx) {
  37. ret = fwrite(pkt.data, 1, pkt.size, audio_dst_file);
  38. //printf("ap %x %3"PRId64" %3"PRId64" (size=%5d)\n", pkt.pos, pkt.pts, pkt.dts, ret);
  39. }
  40. av_packet_unref(&pkt);
  41. }
  42. printf("Demuxing succeeded.\n");
  43. end:
  44. avformat_close_input(&fmt_ctx);
  45. fclose(video_dst_file);
  46. fclose(audio_dst_file);
  47. return 0;
  48. }

3.2 编译

源文件为demuxing.c,在SHELL中执行如下编译命令:

  1. gcc -o demuxing demuxing.c -lavformat -lavcodec -g

生成可执行文件demuxing

3.3 验证

测试文件下载:tnshih.flv



先看一下测试用资源文件的格式:

  1. think@opensuse> ffprobe tnshih.flv
  2. ffprobe version 4.1 Copyright (c) 2007-2018 the FFmpeg developers
  3. Input #0, flv, from 'tnshih.flv':
  4. Metadata:
  5. encoder : Lavf58.20.100
  6. Duration: 00:00:37.20, start: 0.000000, bitrate: 1182 kb/s
  7. Stream #0:0: Video: h264 (High), yuv420p(progressive), 800x450, 25 fps, 25 tbr, 1k tbn, 50 tbc
  8. Stream #0:1: Audio: aac (LC), 44100 Hz, stereo, fltp

可以看到视频文件'tnshih.flv'封装格式为flv,包含一路h264编码的视频流和一路aac编码的音频流。

运行如下命令进行测试:

  1. ./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封装格式:

测试:

  1. ffmpeg -i tnshih.flv -map 0 -c copy tnshih.ts

运行如下命令进行测试:

  1. ./demuxing tnshih.ts tnshih_ts.h264 tnshih_ts.aac

使用ffplay播放视频文件thshih_ts.h264及音频文件tnshih_ts.aac,播放正常。使用ffprobe检测发现这两个文件正常。

FFmpeg封装格式处理2-解复用例程的更多相关文章

  1. FFmpeg封装格式处理4-转封装例程

    本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10506662.html FFmpeg封装格式处理相关内容分为如下几篇文章: [1]. F ...

  2. FFmpeg封装格式处理3-复用例程

    本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10506653.html FFmpeg封装格式处理相关内容分为如下几篇文章: [1]. F ...

  3. FFmpeg封装格式处理

    本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10506636.html FFmpeg封装格式处理相关内容分为如下几篇文章: [1]. F ...

  4. 音视频处理之FFmpeg封装格式20180510

    一.FFMPEG的封装格式转换器(无编解码) 1.封装格式转换 所谓的封装格式转换,就是在AVI,FLV,MKV,MP4这些格式之间转换(对应.avi,.flv,.mkv,.mp4文件). 需要注意的 ...

  5. 最简单的基于FFmpeg的封装格式处理:视音频复用器(muxer)

    ===================================================== 最简单的基于FFmpeg的封装格式处理系列文章列表: 最简单的基于FFmpeg的封装格式处理 ...

  6. 最简单的基于FFmpeg的封装格式处理:视音频分离器(demuxer)

    ===================================================== 最简单的基于FFmpeg的封装格式处理系列文章列表: 最简单的基于FFmpeg的封装格式处理 ...

  7. 最简单的基于FFmpeg的封装格式处理:视音频分离器简化版(demuxer-simple)

    ===================================================== 最简单的基于FFmpeg的封装格式处理系列文章列表: 最简单的基于FFmpeg的封装格式处理 ...

  8. (转)【多媒体封装格式详解】--- AAC ADTS格式分析

     出自:http://blog.csdn.net/tx3344/article/details/7414543 http://www.it6655.com/2012/08/aac-adts-html ...

  9. FLV视频封装格式详解

    FLV视频封装格式详解 分类: FFMpeg编解码 2012-04-04 21:13 1378人阅读 评论(2) 收藏 举报 flvheaderaudiovideocodecfile 目录(?)[-] ...

随机推荐

  1. 快速解决MariaDB无密码就可以登录的问题

    mysql  Ver 15.1 Distrib 10.1.37-MariaDB, for Linux (x86_64) using readline 5.1 #mysql -uroot -p #del ...

  2. Oracle 触发器和序列的创建和使用 (自动增长列)

    -- 创建序列 create sequence 序列名称        start with 1 -- 起始值        increment by 1 -- 增量        maxvalue ...

  3. 重写comparater比较器

    TreeSet 能自动对对象进行排序,但是一般需要在类中重写比较方法 比较器介绍 在类中实现Comparable接口,并重写compareTo方法 排序对象类 package typing.overr ...

  4. 简单利用jQuery,让前端开发不再依赖于后端的接口

    前端开发的过程中,我们免不了和后端进行联调,这时候就会出现以下的尴尬场景: 接口没写好,没法做接下来的功能 功能写好了,接口没写好,没法测这个功能 联调了,出了BUG,不知道锅在谁身上,只得陪后端耗时 ...

  5. 安卓逆向学习---深入Smali文件

    参考:https://www.52pojie.cn/thread-396966-1-1.html Smali中的包信息 .class public Lcom/aaaaa; //他是com.aaaaa这 ...

  6. drf1 rest & restful规范

    web服务交互 我们在浏览器中能看到的每个网站,都是一个web服务.那么我们在提供每个web服务的时候,都需要前后端交互,前后端交互就一定有一些实现方案,我们通常叫web服务交互方案. 目前主流的三种 ...

  7. Apache Thrift的C++多线程编程定式

    Facebook贡献给Apache的开源RPC组件Thrift有着广泛的应用,C++中使用Thrift也十分普遍,但由于Thrift的Handler会被多个线程调用,因而多线程中应用并不直接的友好,利 ...

  8. commons-text StrBuilder字符串构建工具类例子

    package com.skylink.junge.demo; import java.util.ArrayList; import java.util.List; import org.apache ...

  9. 微信小程序基础

    前言 什么是微信小程序,它是一种轻量级的APP,它与常规App来说,无需下载安装即可使用,它嵌于微信App中,要使用微信小程序你只需要搜索一下微信小程序的名称就好,如近期的"Google的画 ...

  10. Nginx---(Server虚拟主机)

    server{ listen PORT; server_name NAME; root /PATH: } 基于端口 listen指令监听在不同的端口; 基于IP 基于FQDN (域名,主机名) ser ...