2013-08-20 34 views
2

我在收到视频转换后的消息Invalid and inefficient vfw-avi packed B frames detected检测到无效且效率低的vfw-avi打包B帧

转换视频后,我检查了视频中的像素值。值与原始视频不同。转换后为什么值会改变?

和我使用无损帧内视频编解码器 'FFV1'

命令: 的ffmpeg -i input_video -vcodec FFV1 -acodec pcm_s16le output_video

ffmpeg version 1.1.1 Copyright (c) 2000-2013 the FFmpeg developers 
built on Jan 20 2013 23:05:28 with gcc 4.7.2 (GCC) configuration: 
--enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-libass --enable-libbluray --enable-libcaca --enable-libfreetype --enable-libgsm --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxavs --enable-libxvid --enable-zlib libavutil  52. 13.100/52. 13.100 libavcodec  54. 86.100/54. 86.100 libavformat 54. 59.106/54. 59.106 libavdevice 54. 3.102/54. 3.102 libavfilter  3. 32.100/3. 32.100 libswscale  2. 1.103/
2. 1.103 libswresample 0. 17.102/0. 17.102 libpostproc 52. 2.100/52. 2.100 [mpeg4 @ 02e218c0] Invalid and inefficient vfw-avi packed B frames detected Input #0, avi, from 
'D:\video_output\avi\1.avi': Metadata: 
    encoder   : Lavf54.59.106 Duration: 00:04:25.52, start: 0.000000, bitrate: 2744 kb/s 
    Stream #0:0: Video: mpeg4 (Advanced Simple Profile) (DX50/0x30355844), yuv420p, 720x544 [SAR 1:1 DAR 45:34], 25 tbr, 25 tbn, 25 
tbc 
    Stream #0:1: Audio: ac3 ([0] [0][0]/0x2000), 48000 Hz, stereo, fltp, 192 kb/s Output #0, matroska, to 'D:\video_output\avi\1_2.mkv': 
Metadata: 
    encoder   : Lavf54.59.106 
    Stream #0:0: Video: ffv1 (FFV1/0x31564646), yuv420p, 720x544 [SAR 1:1 DAR 45:34], q=2-31, 200 kb/s, 1k tbn, 25 tbc 
    Stream #0:1: Audio: pcm_s16le, 48000 Hz, stereo, s16, 1536 kb/s Stream mapping: Stream #0:0 -> #0:0 (mpeg4 -> ffv1) Stream #0:1 -> 
#0:1 (ac3 -> pcm_s16le) Press [q] to stop, [?] for help [mpeg4 @ 02e27920] Invalid and inefficient vfw-avi packed B frames detected 
frame= 36 fps=0.0 q=0.0 size= 1916kB time=00:00:01.56 
bitrate=10008.5kbits/s 
... 
frame= 6565 fps= 46 q=0.0 size= 862611kB time=00:04:22.72 
bitrate=26897.5kbits/s  frame= 6594 fps= 46 q=0.0 size= 864799kB 
time=00:04:23.87 bitrate=26848.0kbits/s  frame CRC mismatch frame= 
6629 fps= 46 q=0.0 size= 866407kB time=00:04:25.20 
bitrate=26763.2kbits/s  frame= 6638 fps= 46 q=0.0 Lsize= 866521kB 
time=00:04:25.56 bitrate=26730.5kbits/s  

video:816725kB audio:49668kB subtitle:0 global headers:0kB muxing 
overhead 0.014713% 

C++代码

void ProcessVideo::processFrame1(string fileName1, string fileName2) { 
this->capture.open(fileName1); 
if (!this->capture.isOpened()) 
    cout<<"video1 error"; 

get_videoInfo(); 

set_videoInfo(); 

this->capture1.open(fileName2); 
if (!this->capture1.isOpened()) 
    cout<<"video2 error"; 

cv::Mat frame; // current video frame 
cv::Mat frame1; // current video frame 

cv::namedWindow("image1"); 
cv::namedWindow("image2"); 

int count = 0; 
int count1 = 0; 

while (1) { 
    capture >> frame; 
    capture1 >> frame1; 

    if (frame.empty()) { 
     //break; 
     cout<<"Frame1 Empty"<<endl; 
    } 
    cv::Mat_<cv::Vec3b>::iterator it=frame.begin<cv::Vec3b>(); 
    cv::Mat_<cv::Vec3b>::iterator itend=frame.end<cv::Vec3b>(); 

    if (frame1.empty()) { 
     //break; 
     cout<<"Frame2 Empty"<<endl; 
    } 

    cv::Mat_<cv::Vec3b>::iterator it1=frame1.begin<cv::Vec3b>(); 
    cv::Mat_<cv::Vec3b>::iterator itend1=frame1.end<cv::Vec3b>(); 

    if(frame.empty() && frame1.empty()) { 
     break; 
    } 

    count1++; 

    int i=0,j=0,k=0; 

    while(it!=itend && it1!=itend1) { 
     ++it; 
     ++it1; 

     count++; 

     if((*it)[0] != (*it1)[0]){ 
      i++; 
     } 
     else if((*it)[1] != (*it1)[1]){ 
      j++; 
     } 
     else if((*it)[2] != (*it1)[2]){ 
      k++; 
     } 
    } 
    cout<<"count diffrent pixel : "<<i<<"\t"<<j<<"\t"<<k<<"\t"; 

    cout<<"\n------------------------"<<count1<<"finish frame-----------------------\n"<<endl; 

    cv::imshow("image1", frame); 
    cv::imshow("image2", frame1); 
    cv::waitKey(1); 
} 

this->capture.release(); 
this->capture1.release(); 

}

+0

您正在使用的工具?分享你的代码..提到产生这个错误的步骤。并访问http://stackoverflow.com/help/on-topic – Paritosh

+0

你忘了包括你的ffmpeg命令。你怎么知道“像素值”改变了? – LordNeckbeard

+0

您的程序是否使用与ffmpeg相同的divx解码器?我想我记得h.264声称对它使用的DCT有一个确切的定义是一个特征,因为它使得通过不同解码器的比特精确解码是必需的。 (哪个divx没有,部分原因是在解码和使用帧作为参考之间的循环中没有解块滤波器)。您发布的代码片段不够完整,无法让任何人自行编译和尝试。 –

回答

2

T他的avi容器格式不支持b帧。有人用黑客来把b帧放入avi容器。 ffmpeg只是显示一条警告,让您知道由于不支持的输入文件,转换过程中可能会遇到问题。就不同的'像素值'你需要详细说明。视频压缩是一个有损耗的过程。你不会得到与你相同的数值。只需“足够接近”的值。

如果要传输复用(从一个容器转换为另一种无需转码)使用 ffpmeg -acodec copy -vcodec copy

0

由于安德烈亚斯Cadhalpun ffmpeg现在有新的过滤器:mpeg4_unpack_bframes(见ref)。

用法简单:

ffmpeg -i INPUT.avi -codec copy -bsf:v mpeg4_unpack_bframes OUTPUT.avi