我安装了最新的ffmpeg,但似乎无法找到视频编解码器.我是否需要完成删除ffmpeg并重新运行./configure以使ffmpeg找到视频编解码器?
这是我目前的配置:
FFmpeg version git-f61cbc2, Copyright (c) 2000-2011 the FFmpeg developers
built on Jan 18 2011 10:59:49 with gcc 4.0.1 (Apple Inc. build 5465)
configuration: --enable-libmp3lame --enable-shared --disable-mmx --arch=x86_64
libavutil 50.36. 0 / 50.36. 0
libavcore 0.16. 1 / 0.16. 1
libavcodec 52.108. 0 / 52.108. 0
libavformat 52.94. 0 / 52.94. 0
libavdevice 52. 2. 3 / 52. 2. 3
libavfilter 1.74. 0 / 1.74. 0
libswscale 0.12. 0 / 0.12. 0
或者,我可以重新运行make命令来包含库吗?
这是我的代码转换代码段:
ffmpeg -i ~/Desktop/watercarts.mov …
我正在使用FFmpeg录制视频,我希望它写入的帧速率至少在正确的球场.现在我采用输入声称拥有的帧速率,并使用它来设置输出视频流的帧速率(time_base).然而,这有时与我得到的实际帧速率大不相同(我看到一个流声称50 fps但以9 fps发布).
我想要做的是使用经过时间的计时器并计算我记录的帧数来计算我在完成录制时记录的实际帧速率.我似乎在我编写任何帧之前,我在AVStream中设置的帧速率在avcodec_open2中使用.如果我稍后设置它(例如在我写帧的时候),而ffplay可以播放它(抱怨时间增量位是6而不是4)其他视频播放器不能.有没有办法在写入帧后设置整个文件的帧速率?如果没有办法在我录制时告诉帧本身某种时间戳或帧速率会产生有效的录制文件?
我正在尝试使用 FFmpeg 和 C++ 创建 mp4 视频文件,但结果我收到损坏的文件(Windows 播放器显示“无法播放 ... 0xc00d36c4”)。如果我创建 .h264 文件,它可以用 'ffplay' 播放并通过 CL 成功转换为 mp4。
我的代码:
int main() {
char *filename = "tmp.mp4";
AVOutputFormat *fmt;
AVFormatContext *fctx;
AVCodecContext *cctx;
AVStream *st;
av_register_all();
avcodec_register_all();
//auto detect the output format from the name
fmt = av_guess_format(NULL, filename, NULL);
if (!fmt) {
cout << "Error av_guess_format()" << endl; system("pause"); exit(1);
}
if (avformat_alloc_output_context2(&fctx, fmt, NULL, filename) < 0) {
cout << "Error avformat_alloc_output_context2()" << endl; system("pause"); exit(1);
}
//stream creation + …Run Code Online (Sandbox Code Playgroud) 我使用SDP的profile-level-id et sprop-parameter-set设置AvCodecContext的profile_idc,level_idc,extradata和extradata_size.
我将Coded Slice,SPS,PPS和NAL_IDR_SLICE数据包的解码分开:
uint8_t start_sequence [] = {0,0,1}; int size = recv(id_de_la_socket,(char*)rtpReceive,65535,0);
char *z = new char[size-16+sizeof(start_sequence)];
memcpy(z,&start_sequence,sizeof(start_sequence));
memcpy(z+sizeof(start_sequence),rtpReceive+16,size-16);
ConsumedBytes = avcodec_decode_video(codecContext,pFrame,&GotPicture,(uint8_t*)z,size-16+sizeof(start_sequence));
delete z;
Run Code Online (Sandbox Code Playgroud)
结果:ConsumedBytes> 0且GotPicture> 0(经常)
相同的代码.结果:ConsumedBytes> 0且GotPicture = 0
我认为这是正常的
当我找到一对新的SPS/PPS时,我使用此数据包的有效负载及其大小更新extradata和extrada_size.
Nal单元类型是28 => idr帧被分段为此我尝试了两种方法来解码
1)我在第一个片段(没有RTP头)前加上序列0x000001,并将其发送到avcodec_decode_video.然后我将剩下的片段发送到这个函数.
2)我将第一个片段(没有RTP头)加上序列0x000001的前缀,并将其余的片段连接到它.我把这个缓冲区发送给解码器.
在这两种情况下,我都没有错误(ConsumedBytes> 0)但我没有检测到任何帧(GotPicture = 0)......
问题是什么 ?
许多运行Android的新硬件平台,特别是NVIDIA的Tegra 2,支持OpenMAX进行媒体加速.在没有这种支持的情况下,在今天的设备上解码720p视频实际上是不可能的,但Android上支持的多路分离器数量相当渺茫.我能找到的唯一公共API是通过Android SDK中的MediaPlayer类.但是,Android源代码树中有多个地方与OpenMAX相关的花絮.
在我的设备(三星Galaxy Tab 10.1)上,我可以通过/ system/lib中的众多OpenMAX库访问硬件解码器,将我的视频应用程序与这些接口连接起来会很棒.有人能指出我有关实现OpenMAX驱动的解码器的信息吗?我找到了来自Khronos的文档,但没有任何代码示例代码或教程.我已经完成了demuxing甚至软件解码(通过libavcodec/libavformat),我只想把钩子放进去启用硬件编码.我也在这里假设有必要直接链接到设备上可用的设备,这使得它在便携性方面相当黯淡,但它的工作原理.
或者,我对任何人都知道用于访问Tegra 2设备上可用的视频解码的私有API感兴趣.特别是如果有一个像NVIDIA为桌面Linux发行版实现的vdpau界面,因为有足够的可用 - 但我无法找到表明支持的共享库.
默认情况下,libavformat将错误消息写入stderr,如:
Estimating duration from bitrate, this may be inaccurate
我怎么能把它关掉?或者更好的是,把它管道到我自己的整洁记录功能?
编辑:将stderr重定向到其他地方是不可接受的,因为我需要它用于其他日志记录目的,我只是希望libavformat不写入它.
我想将YUV420P图像(从H.264流中接收)转换为RGB,同时也调整大小,使用sws_scale.
原始图像的大小是480 × 800.只需转换相同的尺寸即可.
但是当我尝试更改尺寸时,我得到一个扭曲的图像,具有以下模式:
481 × 800将产生扭曲的B&W图像,看起来像是在中间切割482 × 800 将更加扭曲483 × 800 是扭曲但颜色484 × 800 没问题(缩放正确).现在这个模式如下 - 如果除以4之间的差异,缩放将只能正常工作.
这是我解码和转换图像的方式的示例代码.所有方法都显示"成功".
int srcX = 480;
int srcY = 800;
int dstX = 481; // or 482, 483 etc
int dstY = 800;
AVFrame* avFrameYUV = avcodec_alloc_frame();
avpicture_fill((AVPicture *)avFrameYUV, decoded_yuv_frame, PIX_FMT_YUV420P, srcX , srcY);
AVFrame *avFrameRGB = avcodec_alloc_frame();
AVPacket avPacket;
av_init_packet(&avPacket);
avPacket.size = read; // size …Run Code Online (Sandbox Code Playgroud) 我如何可以检测从失败av_interleaved_write_frame/ av_write_frame时的输出使用TLS和连接失败?目标变为不可用后,这两个函数将继续返回0.当不使用TLS时,函数立即检测到故障并返回-ve返回码.
TLS输出:
av_interleaved_write_frame st.tb=90000, result=0
Run Code Online (Sandbox Code Playgroud)
非TLS输出:
av_interleaved_write_frame failed result=-32 - Broken pipe
Run Code Online (Sandbox Code Playgroud)
也可以使用命令行工具演示此行为.
普通连接的预期结果 - 连接失败终止程序:
$ ffmpeg -rtsp_transport tcp -i rtsp://<rtsp_source>:554... -vcodec copy -an -f rtsp "rtsp://<rtsp_dest>:1935..."
ffmpeg version N-68044-g9f9440b Copyright (c) 2000-2014 the FFmpeg developers
built on Nov 27 2014 03:13:44 with gcc 4.9.2 (GCC)
configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora …Run Code Online (Sandbox Code Playgroud) 我想首先解码MP3音频文件,然后增加音频的音量,然后再将其编码为新的MP3文件.我想为此使用libavformat或libavcodec.你能帮我解决这个问题吗?任何例子?
我有项目(ASP.NET Core,在 Linux 上),其中有几个任务与视频转换和从视频文件中提取帧有关。
我考虑了两种可能的选择:
ffmpeg控制台实用程序P/Invoke与libavcodec图书馆和其他人,其ffmpeg用途第二种选择更难,可能非常不切实际,因为它提醒我开发新的包装器/库,而不是使用现成的产品。
我已经完成了谷歌搜索,但没有针对 Linux 平台上的 C#/ASP.NET Core 做好的项目。有一些适用于 C++ 和 Python,但不适用于 Linux/.NET Core 上的 C#。
我决定看第一个选项,我认为它会更容易和实用。但是,也有一些薄弱的地方,这会产生很多问题。我们理解(我想),使用第一个选项,最终开发人员应使用进程分叉。因此,进程空闲和其他可能的问题可能存在问题......
我问的是你的做法,因为这是我第一次在 Linux 平台上使用 C# 进行视频转换/采样。我已经在 Windows 平台上使用了Expression Encoder .NET 库,但它是另一回事,现在没有任何意义。
可能还有其他选项,我目前看不到。我不喜欢第一个选项,因为可能存在未处理的异常,因为ffmpeg这样的角色成为 ASP.NET Core 后端的黑匣子。
libavcodec ×10
ffmpeg ×9
libavformat ×5
c++ ×3
libav ×2
android ×1
asp.net-core ×1
c ×1
c# ×1
decoding ×1
frame-rate ×1
h.264 ×1
linux ×1
rtp ×1
tegra ×1
video ×1
yuv ×1