c++ - 如何使用 FFMPEG 从存储为视频 AVPackets 的 NAL 单元播放 H.264 流

标签 c++ ffmpeg video-streaming h.264

我正在编写客户端-服务器系统,该系统使用 FFMPEG 库将 H.264 流解析为服务器端的 NAL 单元,然后使用信道编码将它们通过网络发送到客户端,我的应用程序必须能够在客户端播放视频.

问题是如何在我的应用程序中将接收到的 AVPackets(NAL 单元)作为视频流播放。 我找到了 this tutorial很有帮助,并将其用作服务器端和客户端的基础。

一些与播放视频相关的示例代码或资源不是来自文件,而是来自使用 FFMPEG 库的程序内部数据将非常有帮助。

我确信收到的信息足以播放视频,因为我尝试将收到的数据保存为 .h264 或 .mp4 文件,并且可以通过 VLC 播放器播放。

最佳答案

我从你的问题中了解到,你有 AVPackets 并且想要播放视频。实际上这是两个问题; 1. 解码您的数据包,以及 2. 播放视频。

要使用 FFmpeg 解码您的数据包,您应该查看 AVPacket 的文档, AVCodecContextavcodec_decode_video2获得一些想法;一般的想法是你想做一些事情(只是在浏览器中写这个,用一粒盐):

//the context, set this appropriately based on your video. See the above links for the documentation 
AVCodecContext *decoder_context; 
std::vector<AVPacket> packets;   //assume this has your packets
...
AVFrame *decoded_frame = av_frame_alloc();
int ret = -1;
int got_frame = 0;
for(AVPacket packet : packets) 
{
    avcodec_get_frame_defaults(frame);
    ret = avcodec_decode_video2(decoder_context, decoded_frame, &got_frame, &packet);
    if (ret <= 0) {
        //had an error decoding the current packet or couldn't decode the packet
        break;
    } 

    if(got_frame)
    {
        //send to whatever video player queue you're using/do whatever with the frame
        ...
    }
    got_frame = 0;
    av_free_packet(&packet);
}

这是一个非常粗略的草图,但这是解码 AVPackets 问题的一般思路。至于你播放视频的问题,你有很多选择,这可能更多地取决于你的客户。你问的是一个相当大的问题,我建议你熟悉 FFmpeg 文档和在 the FFmpeg site 提供的示例。 .希望这是有道理的

关于c++ - 如何使用 FFMPEG 从存储为视频 AVPackets 的 NAL 单元播放 H.264 流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15938469/

相关文章:

c++ - 跨shared_ptr的dynamic_cast?

c++ - 函数内部的递归函数c++

php - FFmpeg Laravel 如何制作 ffmpeg -f concat -i mylist.txt -c 复制 Laravel 的 Two_BeSureToWearFlowersInYourHair.mp3

video - 为什么 libavcodec 只能提供时间戳的估计值?

ffmpeg 为 MJPEG 编码生成更高质量的图像

java - 使用 Spring 和 HTML5 瓶颈搜索/清理本地视频

c++ - C/C++ 用十六进制初始化 double

c++ - 当索引超出范围时,检索方法是否应该引发异常?

asp.net-core - 是否可以将 ffmpeg 命令的输出流式传输到具有 dot net core 的客户端?

Symfony2 视频流