Taiwan Hadoop Forum

台灣 Hadoop 技術討論區
現在的時間是 2022-07-02, 12:19

所有顯示的時間為 UTC + 8 小時




發表新文章 回覆主題  [ 29 篇文章 ]  前往頁數 上一頁  123  下一頁
發表人 內容
 文章主題 : Re: 云视频点播平台
文章發表於 : 2012-04-07, 23:12 
離線

註冊時間: 2009-11-09, 19:52
文章: 2897
Tuzibuluo 寫:
jazz大大,按照你给我的提示,程序差不多完成了,但是转化出来的FLV文件我想利用yamdi加入关键帧,Linux不太熟,利用FFMPEG和yamid对FLV 视频文件进行处理,linux两个命令怎么用管道串行执行,例如:我的第一个命令是 ffmpeg -i(输入) /home/tuzibuluo/source.flv -f flv -y -o(输出文件的路径) 第二个命令是 yamid -i(输入) (要用到第一个命令的输出文件路径-o 的值) -o(第二个命令yamid输出文件的路径) /home/tuzibuluo/target.flv 怎么把第一命令的输出-o作为第二个命令的 -i 的值,这个命令该怎么写,IO重定向还是管道,完整的命令是?谢谢!


如果兩個命令在同一個 mapper 就可以完成,那寫在 mapper.sh 裡即可。
代碼:
#!/bin/bash

id="tuzibuluo"
mkdir -p /tmp/$id
mkdir -p /tmp/$id/target

while read line; do
  input=$line
  filename=`basename $input`
  hadoop fs -get $input /tmp/$id/$filename"
  ffmpeg -i /tmp/$id/$filename -f flv -y -o /tmp/$id/$(filename/avi/flv)
  yamid -i /tmp/$id/$(filename/avi/flv) -o /tmp/$id//target/$(filename/avi/flv)
  hadoop fs -put /tmp/$id//target/$(filename/avi/flv) .
done
rm -rf /tmp/$id


說明:${變數/舊字串/新字串} # 若變數內容符合『舊字串』則『第一個舊字串會被新字串取代』

- Jazz


回頂端
 個人資料 E-mail  
 
 文章主題 : Re: 云视频点播平台
文章發表於 : 2012-04-08, 02:43 
離線

註冊時間: 2012-03-28, 01:26
文章: 44
不好意思打個岔,問一下樓主,請問ffmpeg分割與合併影像的shell指令是什麼啊?抱歉有點懶得慢慢查^^

以前我分割與合併影像用mkvmerge,但發現它分割完之後幾乎都不會留存原始影像的信息(諸如影像比特率,聲音比特率,幀率等)

分割命令類似這樣
代碼:
mkvmerge --split size:30m ./avatar-tlrf_h1080p.mov -o ./avatar-tlrf_h1080p.mov.%05d.mp4


合併命令類似這樣
代碼:
mkvmerge -o avatar-tlrf_h1080p.mov.mp4 \
avatar-tlrf_h1080p.mov.00001.mp4.mp4  \
+avatar-tlrf_h1080p.mov.00002.mp4.mp4  \
+avatar-tlrf_h1080p.mov.00003.mp4.mp4  \
...


是這樣的,我的公司現在也需要我做類似雲端轉檔的事情,看了您與Jazz的討論串對我幫助很大

不過我自己就碰到了一個與hadoop無關的問題,剛好藉此發問

我試著將一個影片先分割成數個部分,也就是利用剛才的mkvmerge

然後利用ffmpeg一個個轉檔成H.264格式

轉檔命令類似這樣
代碼:
ffmpeg                            \
-y                                \
-i       avatar-tlrf_h1080p.mov.00001.mp4  \
-vcodec  libx264                  \
-b       3000k                    \
-acodec  libfaac                  \
-ab      96k                      \
-pass    1                        \
-threads 0                        \
         avatar-tlrf_h1080p.mov.00001.mp4.mp4 \
;
ffmpeg                            \
-y                                \
-i       avatar-tlrf_h1080p.mov.00001.mp4  \
-vcodec  libx264                  \
-b       3000k                    \
-acodec  libfaac                  \
-ab      96k                      \
-pass    2                        \
-threads 0                        \
         avatar-tlrf_h1080p.mov.00001.mp4.mp4 \
;


之後再使用mkvmerge將所有轉檔完成的影像合併

但會發生一種問題,在播放的時候,每到了分割的段落時總會出現聲音不連續的現象,會出現極為短暫的雜音

影像部份我就不清楚了,至少我是看不出來,或許也會有相同的問題

請問您在處理影片轉檔時會碰到這樣的問題嗎?您都是怎麼處理的呢?


回頂端
 個人資料 E-mail  
 
 文章主題 : Re: 云视频点播平台
文章發表於 : 2012-04-08, 15:22 
離線

註冊時間: 2009-11-09, 19:52
文章: 2897
theringe 寫:
以前我分割與合併影像用mkvmerge,但發現它分割完之後幾乎都不會留存原始影像的信息(諸如影像比特率,聲音比特率,幀率等)
我試著將一個影片先分割成數個部分,也就是利用剛才的mkvmerge
然後利用ffmpeg一個個轉檔成H.264格式
之後再使用mkvmerge將所有轉檔完成的影像合併
但會發生一種問題,在播放的時候,每到了分割的段落時總會出現聲音不連續的現象,會出現極為短暫的雜音
影像部份我就不清楚了,至少我是看不出來,或許也會有相同的問題
請問您在處理影片轉檔時會碰到這樣的問題嗎?您都是怎麼處理的呢?


1. 我想分割與合併不會保留原始的影音 bitrate 等 metadata 是正常的,因為轉檔時,很可能重新指定。
2. 切割再合併聲音會不連續的現象很可能發生,亦因此有些人在處理影音的時候,會把影音先分離,壓好影像之後,再把聲音合併回去。

我比較常用在 JPG 轉 AVI,還有格式轉換上。慣用 mencoder 跟 ffmpeg
很久以前記的筆記,多半是 2006 年以前了(因為先前作視訊系統跟監控系統,常在轉換一個影音格式,所以留下比較多筆記)
轉貼在這裡給大家參考囉~

Using ffmpeg to convert wmv to 3gp - http://blog.richliu.com/2007/04/24/471/
代碼:
nice -n 19 ffmpeg -y -i “$filename.$extname” -s qcif -r 20 -b 200k -vcodec mpeg4 -ab 64k -ac 2 -ar 22050 -acodec libfaac “$filename.3gp”


用 ffmpeg 轉換 JPG 成 FLV
Converting stream of jpg files to FLV stream - http://stackoverflow.com/questions/7510 ... flv-stream
FFmpeg FAQ 文件 - http://www.ffmpeg.org/faq.html#SEC14
代碼:
ffmpeg -f image2 -r 1 -i frame%04d.jpg  -s 320x240 -y -an -r 24 out.flv

引言回覆:
-f 來源目錄
-r 1 來源檔案為 1 fps
-i frame%4d.jpg 表示輸入檔格式為 frame0000.jpg frame0001.jpg frame0002.jpg 格式
-s 320x240
-y 覆蓋存在的輸出檔案
-an 不錄音(no audio)
-r 24 輸出檔為 24 fps

我猜想把 -i 的 JPG 換成影片應該也是可行。

轉換 MOV 成 AVI (MPEG4v2 格式)
代碼:
mencoder 1-1.mov -o 1-1.avi -ovc lavc -lavcopts vcodec=msmpeg4v2:vhq:vbitrate=640


把原本 720x480 的影片壓成 320x240 的做法是在 -vf 中加上 scale=320:240:1 其中 320 是寬, 240 是高, 1 是 enable interlaced
代碼:
mencoder in.avi -o out.avi -vf pp=md,scale=320:240:1 -ovc lavc -lavcopts vcodec=msmpeg4v2:vhq:vbitrate=640


MPlayer / Mencoder Deinterlace - http://www.ee.oulu.fi/~tuukkat/mplayer/ ... eadme.html
引言回覆:
加上 " -vf pullup,pp=md " 參數後, 確實有差.


avi 轉 flv - http://www.mplayerhq.hu/DOCS/HTML/en/me ... codec.html
代碼:
mencoder input.avi -o output.flv -of lavf -oac mp3lame -lameopts abr:br=56 -ovc lavc \
-lavcopts vcodec=flv:vbitrate=500:mbd=2:mv0:trell:v4mv:cbp:last_pred=3 \
-srate 22050


查 mencoder 支援格式
代碼:
iSensor:~# mencoder -of help -ovc help -oac help
MEncoder dev-CVS--3.3.5 (C) 2000-2006 MPlayer Team
CPU: Intel Pentium 4/Celeron 4 Northwood; Pentium 4 EE/Xeon Prestonia,Gallatin (Family: 15, Stepping: 9)
MMX2 supported but disabled
SSE2 supported but disabled
CPUflags: Type: 15 MMX: 1 MMX2: 0 3DNow: 0 3DNow2: 0 SSE: 1 SSE2: 0
Compiled for x86 CPU with extensions: MMX SSE

Available output formats:
   avi      - Microsoft Audio/Video Interleaved
   mpeg     - MPEG-1/2 system stream format
   lavf     - FFmpeg libavformat muxers
   rawvideo - (video only, one stream only) raw stream, no muxing
   rawaudio - (audio only, one stream only) raw stream, no muxing

Available codecs:
   copy     - frame copy, without re-encoding. Doesn't work with filters.
   frameno  - special audio-only file for 3-pass encoding, see DOCS.
   raw      - uncompressed video. Use fourcc option to set format explicitly.
   nuv      - nuppel video
   lavc     - libavcodec codecs - best quality!
   vfw      - VfW DLLs, currently only AVID is supported.
   qtvideo  - QuickTime DLLs, currently only SVQ1/3 are supported.
   libdv    - DV encoding with libdv v0.9.5
   xvid     - XviD encoding
   x264     - H.264 encoding

Available codecs:
   copy     - frame copy, without re-encoding (useful for AC3)
   pcm      - uncompressed PCM audio
   mp3lame  - cbr/abr/vbr MP3 using libmp3lame
   lavc     - FFmpeg audio encoder (MP2, AC3, ...)
   faac     - FAAC AAC audio encoder


測試 jpeg 直接轉 flv : [註] vbitrate 最好還是設一下, 會比較清晰., 其他參數都與 motion 有關(運算比較久, 但對動態的反應比較好)
代碼:
#!/bin/sh
mencoder  "mf://*.jpg"  -mf fps=10 -o output.flv -of lavf -ovc lavc -lavcopts vcodec=flv:vbitrate=1000:mbd=2:mv0:trell:v4mv:cbp:last_pred=3 -lavfopts i_certify_that_my_video_stream_does_not_use_b_frames


把 HDDV 的 MPEG/TS 格式轉成 FLV

代碼:
# 先把 MPEG/TS 轉成 AVI 格式(把不必要的 TS 資料拿掉)
$ mencoder n2.dv -o n2.avi -ovc copy -oac copy
# 拿 n2.avi 轉換 flv
$ mencoder n2.avi -o nmmba.flv -of lavf -ovc lavc -lavcopts vcodec=flv:vbitrate=500:mbd=2:mv0:trell:v4mv:cbp:last_pred=3 -lavfopts i_certify_that_my_video_stream_does_not_use_b_frames -oac mp3lame -lameopts abr -srate 22050


把 DVD 的 VOB 轉成 AVI
代碼:
mencoder VTS_01_1.VOB -oac mp3lame -ovc lavc -o test.avi


- Jazz


回頂端
 個人資料 E-mail  
 
 文章主題 : Re: 云视频点播平台
文章發表於 : 2012-04-08, 21:30 
離線

註冊時間: 2011-08-01, 11:40
文章: 15
jazz 寫:
Tuzibuluo 寫:
jazz大大,按照你给我的提示,程序差不多完成了,但是转化出来的FLV文件我想利用yamdi加入关键帧,Linux不太熟,利用FFMPEG和yamid对FLV 视频文件进行处理,linux两个命令怎么用管道串行执行,例如:我的第一个命令是 ffmpeg -i(输入) /home/tuzibuluo/source.flv -f flv -y -o(输出文件的路径) 第二个命令是 yamid -i(输入) (要用到第一个命令的输出文件路径-o 的值) -o(第二个命令yamid输出文件的路径) /home/tuzibuluo/target.flv 怎么把第一命令的输出-o作为第二个命令的 -i 的值,这个命令该怎么写,IO重定向还是管道,完整的命令是?谢谢!


如果兩個命令在同一個 mapper 就可以完成,那寫在 mapper.sh 裡即可。
代碼:
#!/bin/bash

id="tuzibuluo"
mkdir -p /tmp/$id
mkdir -p /tmp/$id/target

while read line; do
  input=$line
  filename=`basename $input`
  hadoop fs -get $input /tmp/$id/$filename"
  ffmpeg -i /tmp/$id/$filename -f flv -y -o /tmp/$id/$(filename/avi/flv)
  yamid -i /tmp/$id/$(filename/avi/flv) -o /tmp/$id//target/$(filename/avi/flv)
  hadoop fs -put /tmp/$id//target/$(filename/avi/flv) .
done
rm -rf /tmp/$id


說明:${變數/舊字串/新字串} # 若變數內容符合『舊字串』則『第一個舊字串會被新字串取代』

- Jazz


谢谢jazz大大了..看来要好好学习下Linux脚本了..学到很多,哈哈....


回頂端
 個人資料 E-mail  
 
 文章主題 : Re: 云视频点播平台
文章發表於 : 2012-04-08, 21:39 
離線

註冊時間: 2011-08-01, 11:40
文章: 15
theringe 寫:
不好意思打個岔,問一下樓主,請問ffmpeg分割與合併影像的shell指令是什麼啊?抱歉有點懶得慢慢查^^

以前我分割與合併影像用mkvmerge,但發現它分割完之後幾乎都不會留存原始影像的信息(諸如影像比特率,聲音比特率,幀率等)

分割命令類似這樣
代碼:
mkvmerge --split size:30m ./avatar-tlrf_h1080p.mov -o ./avatar-tlrf_h1080p.mov.%05d.mp4


合併命令類似這樣
代碼:
mkvmerge -o avatar-tlrf_h1080p.mov.mp4 \
avatar-tlrf_h1080p.mov.00001.mp4.mp4  \
+avatar-tlrf_h1080p.mov.00002.mp4.mp4  \
+avatar-tlrf_h1080p.mov.00003.mp4.mp4  \
...


是這樣的,我的公司現在也需要我做類似雲端轉檔的事情,看了您與Jazz的討論串對我幫助很大

不過我自己就碰到了一個與hadoop無關的問題,剛好藉此發問

我試著將一個影片先分割成數個部分,也就是利用剛才的mkvmerge

然後利用ffmpeg一個個轉檔成H.264格式

轉檔命令類似這樣
代碼:
ffmpeg                            \
-y                                \
-i       avatar-tlrf_h1080p.mov.00001.mp4  \
-vcodec  libx264                  \
-b       3000k                    \
-acodec  libfaac                  \
-ab      96k                      \
-pass    1                        \
-threads 0                        \
         avatar-tlrf_h1080p.mov.00001.mp4.mp4 \
;
ffmpeg                            \
-y                                \
-i       avatar-tlrf_h1080p.mov.00001.mp4  \
-vcodec  libx264                  \
-b       3000k                    \
-acodec  libfaac                  \
-ab      96k                      \
-pass    2                        \
-threads 0                        \
         avatar-tlrf_h1080p.mov.00001.mp4.mp4 \
;


之後再使用mkvmerge將所有轉檔完成的影像合併

但會發生一種問題,在播放的時候,每到了分割的段落時總會出現聲音不連續的現象,會出現極為短暫的雜音

影像部份我就不清楚了,至少我是看不出來,或許也會有相同的問題

請問您在處理影片轉檔時會碰到這樣的問題嗎?您都是怎麼處理的呢?



ffmpeg支持合并但是要转码为mpg或者raw vedio 格式再进行合并,考虑到自己的M/R程序,所以不用ffmpeg合并视频文件,用mencoder来合并视频文件,当然我在用ffmpeg进行分割视频文件的时候也会出现画音不同步的情况,不知道你说的聲音不連續是不是这种情况,但至今我找到的解决方法是基于C的,也因为C这块不是很熟,所以还是搁置在那。


回頂端
 個人資料 E-mail  
 
 文章主題 : Re: 云视频点播平台
文章發表於 : 2012-04-16, 17:47 
離線

註冊時間: 2012-03-28, 01:26
文章: 44
引言回覆:
当然我在用ffmpeg进行分割视频文件的时候也会出现画音不同步的情况,不知道你说的聲音不連續是不是这种情况


Hi,

我的情況是這樣,首先我使用 mkvmerge 這隻程式將一段高清影片作分割

接著我將這些分割使用 ffmpeg 一個個轉檔成 H.264 格式的小分割

最後我再使用 mkvmerge 將這些小分割合併成轉檔好的 H.264 影片

過程中的每一個分割與小分割都是影像與聲音同步的正常情況

轉檔合併好的影片也是影像與聲音同步,但每到影片接合處的時間點就會出現不連續的雜音

按照 Jazz 的說法,某些人會在轉檔前先將影音分離,等到影像轉檔與合併完成後再將聲音壓回去

但或許會有更好的解,只是我不知道在Google中要下什麼關鍵字搜索.....


回頂端
 個人資料 E-mail  
 
 文章主題 : Re: 云视频点播平台
文章發表於 : 2012-04-20, 20:39 
離線

註冊時間: 2012-03-28, 01:26
文章: 44
問一個 mapper 重複使用的問題

我按照之前 Jazz 的教學網頁做了一套轉檔的流程
http://trac.nchc.org.tw/cloud/wiki/III120211/Lab10

也是用 hadoop stream 做的,比較顯著的差異是我的 input 是用 NLineInputFormat 讀取,簡易的流程如下

製作 hadoop stream 的輸入檔案,真正的影片檔存在 HDFS 上
代碼:
for ((i=1;i<=${splits};i++)); do echo /user/`whoami`/i_file/${media}.v.${i}.mp4 >> i_conf.txt; done
hadoop fs -mkdir i_conf
hadoop fs -put i_conf.txt i_conf


啟動 hadoop stream
代碼:
hadoop \
jar /home/hdp/dfs/hadoop-0.20.2/contrib/streaming/hadoop-0.20.2-streaming.jar \
-D mapred.reduce.tasks=0 \
-D mapred.map.tasks.speculative.execution=false \
-D mapred.task.timeout=99999999 \
-input  i_conf \
-inputformat org.apache.hadoop.mapred.lib.NLineInputFormat \
-output o_conf \
-mapper /home/hdp/ffmapper.sh \
-file   /home/hdp/ffmapper.sh


其中的 ffmapper.sh 就是影片用 ffmpeg 轉檔的過程

由以上程式碼得知 hadoop 將會啟動 ${splits} 個 mapper (每個 mapper 僅處理 1 個檔案) ,與 Jazz 的教學會啟動 5 個 mapper (每個 mapper 處理 20 個檔案) 不同。

我認為 stream 的 mapper 運行可能不用靠 JVM 所以自然就沒有 reuse 的問題。但依然想知道這樣是不是相對的會耗損大量的 mapper 製造成本?

請問各位高手有什麼最佳化的建議嗎?


回頂端
 個人資料 E-mail  
 
 文章主題 : Re: 云视频点播平台
文章發表於 : 2012-04-20, 21:56 
離線

註冊時間: 2009-11-09, 19:52
文章: 2897
theringe 寫:
我認為 stream 的 mapper 運行可能不用靠 JVM 所以自然就沒有 reuse 的問題。但依然想知道這樣是不是相對的會耗損大量的 mapper 製造成本?


*^__^* 謝謝,學到一招 ~
我記得可以用 -numReduceTasks <num> 設定 reducer 個數,可惜查了一下沒有設定 mapper 個數的方式。

- Jazz


回頂端
 個人資料 E-mail  
 
 文章主題 : Re: 云视频点播平台
文章發表於 : 2012-05-30, 20:02 
離線

註冊時間: 2011-08-01, 11:40
文章: 15
jazz大大,上面利用的hadoop steam来写的视频转码脚本,一方面Linux的脚本语言我不太熟悉,另一方面看了那些脚本语言,貌似用的hadoop fs -put 将视频文件拷贝到本地文件进行交互,再在利用ffmpeg进行的转码,不知道我的理解是否正确,在我的毕设中,我用的是dfs-fuse这个工具将HDFS文件系统直接mount成本地文件来进行转码,ffmpeg也是命令行的java封装,mapreduce也是java程序,在我的map端,根据视频文件的大小划分为M个map转码任务,M个转码任务的输入,我都是用对应的一个文本文件,其内容很简单,就是单单的一条记录而已(key-value)如:1 /user/hadoop/video/Flowdance.avi 只是对应的key不同,然后在map端进行切割和转码,这个过程我在eclipse下测试没问题,在伪分布模式测试也没有问题,但是当我把程序打包成jar作业在完全分布式模式下运行的时候,3台机器转码只有两个视频分片转码成功,而原本的转码视频分片个数应该是N个,但现在无论如何都只有2个,而且mapreduce都是100%的完成,reduce输出结果显示了有N个分片,但是转码的视频文件只有两个,我想请问下这是什么原因,fuse的原因,还是map输入的原因,因为我每个map文件只有一条转码视频的路径记录而已,只是偷偷的做了个转变,在每个map里面调用到用java我封装的ffmpeg来切割和转码该分片,我该从哪些方面去追踪这个原因,谢谢!


回頂端
 個人資料 E-mail  
 
 文章主題 : Re: 云视频点播平台
文章發表於 : 2012-05-31, 13:37 
離線

註冊時間: 2009-11-09, 19:52
文章: 2897
Tuzibuluo 寫:
jazz大大,上面利用的hadoop steam来写的视频转码脚本,一方面Linux的脚本语言我不太熟悉,另一方面看了那些脚本语言,貌似用的hadoop fs -put 将视频文件拷贝到本地文件进行交互,再在利用ffmpeg进行的转码,不知道我的理解是否正确,在我的毕设中,我用的是dfs-fuse这个工具将HDFS文件系统直接mount成本地文件来进行转码,ffmpeg也是命令行的java封装,mapreduce也是java程序,在我的map端,根据视频文件的大小划分为M个map转码任务,M个转码任务的输入,我都是用对应的一个文本文件,其内容很简单,就是单单的一条记录而已(key-value)如:1 /user/hadoop/video/Flowdance.avi 只是对应的key不同,然后在map端进行切割和转码,这个过程我在eclipse下测试没问题,在伪分布模式测试也没有问题,但是当我把程序打包成jar作业在完全分布式模式下运行的时候,3台机器转码只有两个视频分片转码成功,而原本的转码视频分片个数应该是N个,但现在无论如何都只有2个,而且mapreduce都是100%的完成,reduce输出结果显示了有N个分片,但是转码的视频文件只有两个,我想请问下这是什么原因,fuse的原因,还是map输入的原因,因为我每个map文件只有一条转码视频的路径记录而已,只是偷偷的做了个转变,在每个map里面调用到用java我封装的ffmpeg来切割和转码该分片,我该从哪些方面去追踪这个原因,谢谢!


好難閱讀的一段文字。一般要除錯,純描述問題比較難推敲(特別是您問的問題已經涉及非常多設定,有 FUSE、得安裝 FFMPEG 等)。
要幫忙除錯除非碰巧我們有這樣的環境可以測試。建議最好先從 JobTracker 查詢該 Job 的 Log 紀錄,看是否有錯誤訊息。
否則就是得要提供完整的重現步驟(也就是任何一個人,如果想要重現這個現象該怎摩作)。

- Jazz


回頂端
 個人資料 E-mail  
 
顯示文章 :  排序  
發表新文章 回覆主題  [ 29 篇文章 ]  前往頁數 上一頁  123  下一頁

所有顯示的時間為 UTC + 8 小時


誰在線上

正在瀏覽這個版面的使用者:沒有註冊會員 和 3 位訪客


不能 在這個版面發表主題
不能 在這個版面回覆主題
不能 在這個版面編輯您的文章
不能 在這個版面刪除您的文章
不能 在這個版面上傳附加檔案

搜尋:
前往 :  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
正體中文語系由 竹貓星球 維護製作