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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

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

發布時間:2024/9/21 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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.100Duration: 00:00:37.20, start: 0.000000, bitrate: 1182 kb/sStream #0:0: Video: h264 (High), yuv420p(progressive), 800x450, 25 fps, 25 tbr, 1k tbn, 50 tbcStream #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檢測發現這兩個文件正常。

轉載于:https://www.cnblogs.com/leisure_chn/p/10506642.html

總結

以上是生活随笔為你收集整理的FFmpeg封装格式处理2-解复用例程的全部內容,希望文章能夠幫你解決所遇到的問題。

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